在GO中使用其他语言的库

时间:2013-07-17 10:37:52

标签: c++ go

这似乎是一个愚蠢的问题,但是可以在GO中编写一个可以从其他语言调用的库,例如: C ++?

2 个答案:

答案 0 :(得分:6)

遗憾的是,不能直接(“可以称为”)。平台的C实现定义了一些问题(对于大部分/全部正式supported platforms):

  • 调用约定不一样:例如,Go函数/方法不使用任何寄存器作为返回值(如果有的话)。
  • 执行模型不同:使用拆分堆栈。
  • 垃圾收集器可能会因进程拥有的内存而感到困惑,但GC未将其“注册”为“不可收集”或特别标记(用于精确收集)。
  • Go运行时的初始化是一个问题。它希望在此过程中的任何其他事情之前完成。如果要链接多个Go .so,则不存在用于协调初始化的现成机制。

以上所有内容均适用于'gc'。 “gccgo”在一定程度上放松了。有关此内容的更多信息,请参见C C_Interoperability

答案 1 :(得分: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}