这可能看起来像一个愚蠢的问题,但是可以在GO中编写一个可以从其他语言调用的图书馆。 C++?使一个图书馆在GO中可用于其他语言
2
A
回答
6
不幸的是不是直接(“可以称为”)可能。有一些问题WRT是什么平台的C实现定义(对于大多数/所有的正式supported platforms):
- 调用约定是不一样的:例如,去功能/方法不使用任何寄存器返回值(如果有的话)。
- 执行模式不同:使用拆分堆栈。
- 垃圾收集器可能被进程拥有的内存弄糊涂,但未被GC“注册”为“不可收集”或特别标记(用于精确收集)。
- Go运行时的初始化是一个问题。它期望在此过程中的其他任何事情之前完成。如果要连接多个Go .so,则不存在用于协调初始化的现成机制。
以上所有都适用于'gc'。 'gccgo'中也有一定程度的放松。更多关于这方面的信息在C C_Interoperability。
1
最好的选择是JSON-RPC。我一直在寻找将遗留Python代码与Go集成在一起的方法,直到我找到它为止。 如果您的数据结构可以转换为JSON,那么您就很好。 这是一个愚蠢的例子:
转到JSON-RPC服务器
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type Experiment int
func (e *Experiment) Test(i *string, reply *string) error {
s := "Hello, " + *i
*reply = s
log.Println(s, reply)
return nil
}
func main() {
exp := new(Experiment)
server := rpc.NewServer()
server.Register(exp)
l, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("listen error:", err)
}
for {
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
server.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
Python客户端
import json
import socket
s = socket.create_connection(("127.0.0.1", 1234))
s.sendall(json.dumps(({"id": 1, "method": "Experiment.Test", "params": ["World"]})))
print s.recv(4096)
响应
{"id":1,"result":"Hello, World","error":null}
相关问题
- 1. 如何从其他图书馆活动调用一个图书馆活动?
- 2. 参考其他图书馆
- 3. 在maven doxia图书中使用其他标记语言
- 4. Go图书馆自动化
- 5. 厨师图书馆其他食谱图书馆依赖
- 6. 图书馆作为其他图书馆的依赖
- 7. 使用我的图书馆的AAR文件,该文件对其他图书馆
- 8. 图书馆与语言扩展
- 9. 一个项目中的图书馆,我想使用另一个图书馆
- 10. 在哪个图书馆中有“Contact”和其他实体?
- 11. 使用单一语言创建图书馆,并与其他所有设备连接
- 12. 如何使用图表JS或其他图书馆
- 13. 使用图书馆
- 14. Pylatex使用其他语言
- 15. LXML或其他图书馆解析嵌套的XML使用XPath
- 16. 其中开放源代码许可证用于图书馆,具体取决于其他库
- 17. Django模板语言:在其他语言中使用for循环
- 18. 图书馆对图书馆的引用
- 19. 使用go语言与gitolite
- 20. 语言环境不更新我的图书馆为Android应用
- 21. 是否可以在其他语言中使用LINQ to SQL?
- 22. 如何在图书馆中使用Realm
- 23. 约实体框架与企业图书馆及其他几个
- 24. 上个月其他语言
- 25. 创建一个图书馆一个Arduino
- 26. Dexguard在一个图书馆项目
- 27. 使用lxml的图书馆
- 28. popt图书馆的使用
- 29. 如何使用图书馆
- 30. 我可以在ios8中使用libicucore.dylib,这是一个私人图书馆吗?
我做了几个服务器端的处理任务走这在python中进行管理。大多数情况下,我将Go库放在Go中的JSON-RPC服务器中,并调用相应的函数并返回所需的值。这种模式正变得越来越普遍。 – Streamweaver