如何解决通过“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 举报,一经查实,本站将立刻删除。