有没有办法将 go 源(包括结构类型)构建到 *.so 文件?

Del*_*lta 5 python go hybrid

我正在构建一个由 py​​thon 编写的应用程序。

\n\n

在应用程序中,\n我需要 go 语言提供的函数,因此我尝试制作一个 *.so 文件以将其用作本地库。

\n\n

我应该如何使用包含结构类型的 go-lang 源构建 *.so 。

\n\n
\n\n

Go版本:go版本go1.12.2 windows/amd64

\n\n

python : Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 位 (AMD64)] 在 win32 上

\n\n
\n\n

到目前为止,我成功地使用 go-lang 源构建了一个 *.so 文件,只有一个简单的函数,没有任何结构类型。它是通过 python 代码执行的。

\n\n

然后,我在 go 代码上添加了一个结构参数,之后尝试了相同的构建过程。然而,它从来没有起作用,显示了一些这样的消息。

\n\n
\n

# 命令行参数

\n\n

.\\user_auth.go:37:16:导出中不支持 Go 类型:http.ResponseWriter

\n\n

.\\user_auth.go:37:40:导出中不支持 Go 类型:http.Request

\n\n

.\\user_auth.go:37:16:导出中不支持 Go 类型:http.ResponseWriter

\n\n

.\\user_auth.go:37:40:导出中不支持 Go 类型:http.Request

\n
\n\n

根据here,cmd/cgo似乎直到2017年才支持这种转换。\n我找不到比上面更多的信息。

\n\n

\xe3\x83\xbb成功(ok.go)

\n\n
package main\n\nimport (\n    "C"\n)\n\n\nfunc main() {\n}\n\n//export adder\nfunc adder(a, b int) int {\n    return a + b\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe3\x83\xbb失败(wish_ok.go)

\n\n
package main\n\nimport (\n        "fmt"\n        "net/http"\n        "C"\n\n        "google.golang.org/appengine"\n        "google.golang.org/appengine/user"\n)\n\nfunc main() {\n//  http.HandleFunc("/auth", welcome)\n//\n//  appengine.Main()\n}\n\nfunc init() {\n//    log.Println("Loaded!!")\n}\n\n//export welcome\nfunc welcome(w http.ResponseWriter, r *http.Request) {\n        ctx := appengine.NewContext(r)\n        u := user.Current(ctx)\n        if u == nil {\n                url, _ := user.LoginURL(ctx, "/")\n                fmt.Fprintf(w, `<a href="%s">Sign in or register</a>`, url)\n                return\n        }\n        url, _ := user.LogoutURL(ctx, "/")\n        fmt.Fprintf(w, `Welcome, %s! (<a href="%s">sign out</a>)`, u, url)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望上面的 go-lang 代码可以由 python 执行。\n或者,欢迎通过其他方式获取 gcp(gae-py3.X) 中的用户信息。

\n

小智 2

从 Go 导出到 C 的函数的签名必须仅包含 C 类型(或可以自动转换为 C 类型的原始 Go 类型,例如int)。文档明确指出不支持 Go 结构类型;使用 C 结构类型。(这也在您链接的问题中进行了讨论。)

这就是为什么您不能在导出函数的签名中使用http.ResponseWriteror的原因。*http.Request您必须定义自己的 C 类型来表示 HTTP 请求和响应(可能很痛苦),或者以不同的方式分解本地库(例如,定义单独的loginURLlogoutURL接受和返回字符串的函数)。