从javascript代码中调用Golang函数
要从JavaScript代码中调用Golang函数,可以通过以下步骤实现:
1. 使用WebAssembly(Wasm)技术
WebAssembly(Wasm)是一种低级字节码格式,可以在现代Web浏览器中运行高性能的编译语言,如Golang。
在Golang中编写函数
首先,编写一个简单的Golang函数,将其编译为WebAssembly格式:
gopackage main
import "fmt"
// 导出一个函数,可以被JavaScript调用
func Multiply(a, b int) int {
return a * b
}
func main() {
// main函数不会被编译为Wasm模块,因此可以为空
}
编译为WebAssembly模块
使用Golang的交叉编译功能将代码编译为Wasm模块:
shGOARCH=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服务,并实现相应的函数:
protosyntax = "proto3"; service Calculator { rpc Multiply(MultiplyRequest) returns (MultiplyResponse); } message MultiplyRequest { int32 a = 1; int32 b = 2; } message MultiplyResponse { int32 result = 1; }
编写Golang实现:
gopackage 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服务:
javascriptconst { 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则适合构建实时交互的应用程序。