簡體   English   中英

使庫在其他語言中可用

[英]Making a library usable from other languages in GO

這似乎是一個愚蠢的問題,但是是否可以用其他語言(例如C ++)調用的GO語言編寫一個庫?

不幸的是,這不可能直接( “可以被稱為” )。 平台的C實現定義了一些問題(對於大多數/所有官方支持的平台 ):

  • 調用約定是不一樣的:例如,Go函數/方法不使用任何寄存器作為返回值(如果有的話)。
  • 執行模型不同:使用拆分堆棧。
  • 垃圾收集器可能會被進程所擁有的內存弄糊塗,但GC不會將其“注冊”為“不可收集”或特別標記(用於精確收集)。
  • Go運行時的初始化是一個問題。 它期望在此過程中的其他任何事情之前先完成。 如果要與多個Go .so鏈接,則不存在用於協調初始化的現成機制。

以上所有都適用於'gc'。 在“ gccgo”中也是如此。 有關更多信息,請參見C C_Interoperability

最好的選擇是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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM