从javascript代码中调用Golang函数

在JavaScript中调用Golang函数通常涉及使用WebAssembly(Wasm)技术,因为Golang可以编译成Wasm模块,然后在浏览器中运行。以下是详细的步骤和考虑事项:

准备工作:

  1. 安装Golang

    • 首先确保在本地安装了Golang,并设置好了环境变量。
  2. 编写和编译Golang代码为Wasm

    • 编写Golang函数,并使用Golang的交叉编译功能将其编译为Wasm格式。例如,假设有一个简单的Golang函数如下:
    go
    package main import "fmt" import "syscall/js" func sayHello(this js.Value, inputs []js.Value) interface{} { fmt.Println("Hello from Go!") return nil } func registerCallbacks() { js.Global().Set("sayHello", js.FuncOf(sayHello)) } func main() { c := make(chan struct{}, 0) registerCallbacks() <-c }

    在命令行中使用以下命令编译为Wasm:

    bash
    GOARCH=wasm GOOS=js go build -o main.wasm

    这将生成名为 main.wasm 的Wasm文件。

  3. 准备JavaScript代码

    • 在JavaScript中编写代码以加载和调用Golang编译的Wasm模块。例如:
    javascript
    async function run() { const go = new Go(); const wasm = await fetch('main.wasm'); const instance = await WebAssembly.instantiateStreaming(wasm, go.importObject); go.run(instance); } run();

    这段JavaScript代码会加载 main.wasm 文件,并通过 Go 对象运行Wasm模块。

  4. 调用Golang函数

    • 在JavaScript中调用Golang函数需要通过Wasm的导出函数接口。在Golang代码中,通过 js.Global().Set 将Golang函数暴露给JavaScript,例如上面的 sayHello 函数。
    javascript
    const sayHello = () => { // 调用Golang中的sayHello函数 window.sayHello(); }; sayHello();

    这样,JavaScript代码就可以直接调用Golang中的 sayHello 函数了。

注意事项:

  • 异步调用:Wasm模块运行在Web Worker线程中,因此与JavaScript的交互通常是异步的。
  • 数据类型转换:JavaScript和Golang之间的数据类型转换可能需要额外的处理,特别是复杂对象或数据结构。
  • 性能考虑:Wasm在浏览器中运行,可以提供接近原生代码的性能,但需要注意性能优化和资源管理。

通过上述步骤,你可以在JavaScript中成功调用和使用Golang编写的函数,实现跨语言的应用开发和运行。