如何调用GopherJS编译生成的JavaScript包中的Go函数?
解决GopherJS编译后Go函数在JS中调用的问题
我之前也踩过这个坑,GopherJS的函数导出有特定规则,没做好的话确实找不到对应的函数。下面给你两种贴合需求的解决方案:
方案一:手动挂载到window.testpkg(完全匹配你的调用预期)
如果你希望保留testpkg.Testfunc()的调用形式,可以在编译入口的main函数里手动把Go函数挂载到全局对象上:
- 确保你的
testpkg包中Testfunc是大写开头的导出函数(你已经满足这个条件了):
package testpkg func Testfunc() { // 你的函数逻辑,比如打印测试日志 println("Testfunc 被JS调用了!") }
- 新建
main.go作为编译入口(GopherJS必须以main包为编译起点),导入gopherjs/js包和你的testpkg,手动挂载对象:
package main import ( "github.com/gopherjs/gopherjs/js" "你的testpkg包的实际路径" ) func main() { // 在window上创建testpkg对象,并把Testfunc挂载进去 js.Global().Set("testpkg", map[string]interface{}{ "Testfunc": testpkg.Testfunc, }) }
- 用GopherJS编译生成JS文件:
gopherjs build -o testgopher.js main.go
这时候你就能在JS里按预期调用了:
<script src="./testgopher.js"></script> <script> testpkg.Testfunc(); // 完美执行你的Go函数 </script>
方案二:用//export注释直接暴露函数(更简洁)
如果不需要testpkg前缀,只想直接调用函数,可以用导出注释的方式:
- 给
testpkg里的Testfunc添加//export注释:
package testpkg //export Testfunc func Testfunc() { println("Testfunc 被调用了!") }
- 同样需要
main.go作为入口,空白导入testpkg防止被编译器优化掉:
package main import _ "你的testpkg包的实际路径" func main() { // 这里可以留空,或做初始化操作 }
- 编译后,
Testfunc会直接挂载到window上,JS里直接调用即可:
<script src="./testgopher.js"></script> <script> Testfunc(); </script>
常见坑点排查
- 必须导入
testpkg:如果main包没有引用testpkg,Go编译器会把它优化掉,导致编译后的JS里完全没有相关代码。 - 函数必须大写开头:Go里只有大写标识符是导出的,小写函数GopherJS无法访问。
- 验证编译结果:可以打开
testgopher.js搜索Testfunc或testpkg,确认代码是否被正确包含。
内容的提问来源于stack exchange,提问作者prk68
相关产品推荐
相关产品推荐

