如何在 Cgo 中使用 GoMap?

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


隔江千里
浏览 198回答 1
1回答

哈士奇WWW

你不能。事实上,由于指针传递规则允许 cgo 安全地与 Go 的并发和垃圾收集器一起工作,你不能用 cgo 对这种类型做任何事情。映射在“总是包含 Go 指针”的类型列表中,因此映射不能作为参数传递给 C 函数,不能从 C 代码调用的 Go 函数返回,也不能由 C 存储。如果没有看到更多你想要完成的事情,很难给出你应该做什么的建议,但通常的解决方法是让 Go 代码将对象保存在映射中,然后将 C 代码传递给其中的一个键map(例如,可以自由传递或存储的 C 字符串或 int)作为包含在其中的对象的句柄。C 然后通过 Go 函数与对象进行所有交互,Go 函数可以使用键在映射中找到正确的值。切片也可以。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go