通过 "cgo" 作为键传递 Go 指针

Pass Go Pointer via "cgo" as a Key

我正在 Go 和 Python 之间做一些互操作。我计划在 Go 领域创建对象,并且只能通过 Go 方法从 Python 访问它们。比如下面的struct A,只会在Go land中创建和销毁,只能通过method1访问。但是 Python 代码确实需要知道 handle/pointer 到 struct A 的实例,这样当它将这个 handle/pointer 传递给 Go 函数时,Go 函数知道将它转换为Go指针并调用它的方法。也就是说,Python并没有直接使用Go指针*A作为references/dereferences内存的指针,而是将其作为标识Go对象的key。

问题是对var a *Aint(a)是无效的,我不能直接在cgo方法之间传递*A

我该怎么做才能将 *A 转换为某个整数形式的黑框密钥,然后再将其转换回 *A

type A struct {
    a int
}

func (a *A) method1(){
    fmt.Println("Hello world")
}

简答:你真的做不到。

更长的答案,因为 Go 是垃圾回收的,你可以将指针传递给 C,但它必须 C 必须保留这个 属性:C 不应该在 Go 内存中存储任何 Go 指针,即使是暂时的,也可能不会在调用后保留 Go 指针的副本 returns.

您可以在 cgo 文档 https://golang.org/cmd/cgo/#hdr-Passing_pointers 中阅读更多关于处理和使用的信息,这可能会对您的用例有所帮助。