You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用GopherJS编译生成的JavaScript包中的Go函数?

解决GopherJS编译后Go函数在JS中调用的问题

我之前也踩过这个坑,GopherJS的函数导出有特定规则,没做好的话确实找不到对应的函数。下面给你两种贴合需求的解决方案:

方案一:手动挂载到window.testpkg(完全匹配你的调用预期)

如果你希望保留testpkg.Testfunc()的调用形式,可以在编译入口的main函数里手动把Go函数挂载到全局对象上:

  1. 确保你的testpkg包中Testfunc是大写开头的导出函数(你已经满足这个条件了):
package testpkg

func Testfunc() {
    // 你的函数逻辑,比如打印测试日志
    println("Testfunc 被JS调用了!")
}
  1. 新建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,
    })
}
  1. 用GopherJS编译生成JS文件:
gopherjs build -o testgopher.js main.go

这时候你就能在JS里按预期调用了:

<script src="./testgopher.js"></script>
<script>
    testpkg.Testfunc(); // 完美执行你的Go函数
</script>

方案二:用//export注释直接暴露函数(更简洁)

如果不需要testpkg前缀,只想直接调用函数,可以用导出注释的方式:

  1. 给testpkg里的Testfunc添加//export注释:
package testpkg

//export Testfunc
func Testfunc() {
    println("Testfunc 被调用了!")
}
  1. 同样需要main.go作为入口,空白导入testpkg防止被编译器优化掉:
package main

import _ "你的testpkg包的实际路径"

func main() {
    // 这里可以留空,或做初始化操作
}
  1. 编译后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:46