我正在尝试从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代码?
你不能。实际上,由于pointer-passing rules允许cgo与Go的并发和垃圾收集器安全地工作,因此您实际上不能对cgo进行这种类型的anything。映射位于“始终包含Go指针”的类型列表中,因此,映射不能作为C函数的参数传递,从C代码调用的Go函数返回或由C存储的参数传递。
很难推荐您应该做些什么而又看不到您要完成的工作,但是通常的解决方法是让Go代码将对象保存在地图中,然后传递C从该映射映射一个key(例如,可以自由传递或存储的C字符串或int)作为包含在其中的对象的句柄。然后,C通过Go函数与对象进行所有交互,该函数可以使用键在地图中找到正确的值。切片也可以。