如何在Cgo中使用GoMap?

How to use GoMap in Cgo?

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

main.go:

package main

import (
    "C"
    "fmt"
)

func main() {}

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

哪个 "compiles" 到 main.h:

typedef void *GoMap;

extern void PrintMap(GoMap p0);

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

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

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