微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过“cgo”作为键传递 Go 指针

如何解决通过“cgo”作为键传递 Go 指针

我正在 Go 和 Python 之间进行一些互操作。我计划在 Go 领域创建对象,并且只能通过 Go 方法从 Python 访问它们。例如,下面的 import wx class ResultFrame(wx.Frame): def __init__(self,parent): super(ResultFrame,self).__init__(parent,-1,title = "Results",size = wx.Size(1290,945),pos = wx.Point(50,50),style = wx.CAPTION| wx.CLOSE_Box|wx.MINIMIZE_Box|wx.SYstem_MENU) self.InitUI() self.Layout() self.Center() def InitUI(self): self.mainpnl = wx.Panel(self) self.nbpnl = wx.Panel(self.mainpnl) self.ctrlpnl = wx.Panel(self.mainpnl) self.mainsizer = wx.BoxSizer(wx.HORIZONTAL) self.ctrlsizer = wx.BoxSizer(wx.VERTICAL) self.restart = wx.Button(self.ctrlpnl,wx.ID_ANY,"Start Over",\ size=(100,40)) self.interp = wx.Button(self.ctrlpnl,"Help Interpreting\n" "Results",size=(100,40)) self.nb = wx.Notebook(self.mainpnl) for tar in range(0,4): self.nb.AddPage(wx.Panel(self.nb),f"page {tar}") self.ctrlsizer.Add(self.restart,wx.ALL,5) self.ctrlsizer.AddStretchSpacer() self.ctrlsizer.Add(self.interp,5) self.ctrlpnl.SetSizerAndFit(self.ctrlsizer) self.mainsizer.Add(self.ctrlpnl,0) self.mainsizer.Add(self.nb,1,wx.EXPAND) self.mainpnl.SetSizerAndFit(self.mainsizer) self.CreateStatusBar() self.SetStatusText("Results") def main(): import wx.lib.mixins.inspection app = wx.App() frm = ResultFrame(None) frm.Show() wx.lib.inspection.inspectionTool().Show(refreshTree=True) app.MainLoop() if __name__ == "__main__": main() 只会在 Go 域中创建和销毁,并且只能通过 struct A 访问。但是 Python 代码确实需要知道 method1 实例的句柄/指针,以便当它将此句柄/指针传递给 Go 函数时,Go 函数知道将其转换为 Go 指针并调用方法。换句话说,Python 并没有直接将 Go 指针 struct A 用作引用/取消引用内存的指针,而是将其用作标识 Go 对象的键。

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

我该怎么做才能将 *A 转换为某个整数的黑盒键,然后再将其转换回 *A

*A

解决方法

简短回答:你真的不能。

更长的答案是,因为 Go 是垃圾收集的,所以您可以将指针传递给 C,但它必须 C 必须保留此属性:C 不应在 Go 内存中存储任何 Go 指针,即使是临时的,并且可能不会调用返回后保留一份 Go 指针的副本。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。