如何在Cgo中使用GoMap?

问题描述 投票:0回答:1

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

c++ go cgo go-map
1个回答
4
投票

你不能。实际上,由于pointer-passing rules允许cgo与Go的并发和垃圾收集器安全地工作,因此您实际上不能对cgo进行这种类型的anything。映射位于“始终包含Go指针”的类型列表中,因此,映射不能作为C函数的参数传递,从C代码调用的Go函数返回或由C存储的参数传递。

很难推荐您应该做些什么而又看不到您要完成的工作,但是通常的解决方法是让Go代码将对象保存在地图中,然后传递C从该映射映射一个key(例如,可以自由传递或存储的C字符串或int)作为包含在其中的对象的句柄。然后,C通过Go函数与对象进行所有交互,该函数可以使用键在地图中找到正确的值。切片也可以。

© www.soinside.com 2019 - 2024. All rights reserved.