如何在Cgo中使用GoMap

How to use GoMap in Cgo?

本文关键字:GoMap Cgo      更新时间:2023-10-16

我正试图从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代码?

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

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