2013-07-17 42 views
2

这可能看起来像一个愚蠢的问题,但是可以在GO中编写一个可以从其他语言调用的图书馆。 C++?使一个图书馆在GO中可用于其他语言

+0

我做了几个服务器端的处理任务走这在python中进行管理。大多数情况下,我将Go库放在Go中的JSON-RPC服务器中,并调用相应的函数并返回所需的值。这种模式正变得越来越普遍。 – Streamweaver

回答

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}