我正在构建一个由 python 编写的应用程序。
\n\n在应用程序中,\n我需要 go 语言提供的函数,因此我尝试制作一个 *.so 文件以将其用作本地库。
\n\n我应该如何使用包含结构类型的 go-lang 源构建 *.so 。
\n\nGo版本:go版本go1.12.2 windows/amd64
\n\npython : Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 位 (AMD64)] 在 win32 上
\n\n到目前为止,我成功地使用 go-lang 源构建了一个 *.so 文件,只有一个简单的函数,没有任何结构类型。它是通过 python 代码执行的。
\n\n然后,我在 go 代码上添加了一个结构参数,之后尝试了相同的构建过程。然而,它从来没有起作用,显示了一些这样的消息。
\n\n\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
根据here,cmd/cgo似乎直到2017年才支持这种转换。\n我找不到比上面更多的信息。
\n\n\xe3\x83\xbb成功(ok.go)
\n\npackage 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}\nRun Code Online (Sandbox Code Playgroud)\n\n\xe3\x83\xbb失败(wish_ok.go)
\n\npackage 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}\nRun 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 请求和响应(可能很痛苦),或者以不同的方式分解本地库(例如,定义单独的loginURL和logoutURL接受和返回字符串的函数)。
| 归档时间: |
|
| 查看次数: |
1674 次 |
| 最近记录: |