从javascript代码中调用Golang函数

要从JavaScript代码中调用Golang函数,可以通过以下步骤实现:

1. 使用WebAssembly(Wasm)技术

WebAssembly(Wasm)是一种低级字节码格式,可以在现代Web浏览器中运行高性能的编译语言,如Golang。

在Golang中编写函数

首先,编写一个简单的Golang函数,将其编译为WebAssembly格式:

go
package main import "fmt" // 导出一个函数,可以被JavaScript调用 func Multiply(a, b int) int { return a * b } func main() { // main函数不会被编译为Wasm模块,因此可以为空 }

编译为WebAssembly模块

使用Golang的交叉编译功能将代码编译为Wasm模块:

sh
GOARCH=wasm GOOS=js go build -o multiply.wasm

在JavaScript中调用WebAssembly模块

在JavaScript中加载并调用编译后的Wasm模块:

javascript
// 加载WebAssembly模块 fetch('multiply.wasm') .then(response => response.arrayBuffer()) .then(bytes => WebAssembly.instantiate(bytes, {})) .then(results => { // 提取导出的函数 const { instance } = results; const { exports } = instance; // 调用Golang导出的函数 const result = exports.Multiply(5, 3); console.log('Result:', result); // 输出:15 });

2. 使用gRPC(Google Remote Procedure Call)

另一种方法是通过gRPC实现JavaScript与Golang之间的通信,这种方法更适合需要实时或高度交互的应用程序。

定义和实现gRPC服务

在Golang中定义gRPC服务,并实现相应的函数:

proto
syntax = "proto3"; service Calculator { rpc Multiply(MultiplyRequest) returns (MultiplyResponse); } message MultiplyRequest { int32 a = 1; int32 b = 2; } message MultiplyResponse { int32 result = 1; }

编写Golang实现:

go
package main import ( "context" "log" "net" "google.golang.org/grpc" pb "path/to/your/proto" ) type server struct{} func (s *server) Multiply(ctx context.Context, req *pb.MultiplyRequest) (*pb.MultiplyResponse, error) { result := req.A * req.B return &pb.MultiplyResponse{Result: result}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterCalculatorServer(s, &server{}) log.Println("gRPC server running on port 50051") if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }

在JavaScript中调用gRPC服务

使用gRPC-Web或其他gRPC客户端库在JavaScript中调用gRPC服务:

javascript
const { MultiplyRequest } = require('path/to/your/proto_pb'); const { CalculatorClient } = require('path/to/your/proto_grpc_web_pb'); const client = new CalculatorClient('http://localhost:8080'); const request = new MultiplyRequest(); request.setA(5); request.setB(3); client.multiply(request, {}, (err, response) => { if (err) { console.error('Error:', err); } else { console.log('Result:', response.getResult()); } });

总结

通过WebAssembly或gRPC,可以实现JavaScript与Golang之间的通信。WebAssembly适合运行高性能的Golang函数,而gRPC则适合构建实时交互的应用程序。