如何在 Cgo 中使用 GoMap?

spe*_*ler 2 c++ go cgo go-map

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

main.go:

package main

import (
    "C"
    "fmt"
)

func main() {}

//export PrintMap
func PrintMap(m map[string]string) {
    fmt.Println(m)
}
Run Code Online (Sandbox Code Playgroud)

其中“编译”为main.h

typedef void *GoMap;

extern void PrintMap(GoMap p0);
Run Code Online (Sandbox Code Playgroud)

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

hob*_*bbs 5

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

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