2

我正在尝试从 C++ 调用 Go。我的代码在地图上运行,我似乎无法使地图与 cgo 一起使用。

main.go:

package main

import (
    "C"
    "fmt"
)

func main() {}

//export PrintMap
func PrintMap(m map[string]string) {
    fmt.Println(m)
}

其中“编译”为main.h

typedef void *GoMap;

extern void PrintMap(GoMap p0);

如何在我的 c++ 代码中成功创建 GoMap 并将其传递给 go 代码?

4

1 回答 1

5

你不能。事实上,由于指针传递规则允许 cgo 安全地与 Go 的并发和垃圾收集器一起工作,你不能用 cgo 对这种类型做任何事情。映射在“总是包含 Go 指针”的类型列表中,因此映射不能作为参数传递给 C 函数,不能从 C 代码调用的 Go 函数返回,也不能由 C 存储。

如果没有看到更多你想要完成的事情,很难给出你该做什么的建议,但通常的解决方法是让 Go 代码将对象保存在映射中,然后将 C 代码传递给其中的一个map(例如,可以自由传递或存储的 C 字符串或 int)作为包含在其中的对象的句柄。C 然后通过 Go 函数与对象进行所有交互,Go 函数可以使用键在映射中找到正确的值。切片也可以。

于 2020-02-17T16:47:18.223 回答