JavaScript Golang 中运转 如何在
咱们知道,在 Python 外面,假设你要运转一段 JavaScript,你可以经常使用execJS这种第三方库。那么在 Golang 外面,你想运转JavaScript 的时刻又应该怎样办呢?
最近我发现一个经常使用 Golang 开发的 JavaScript 引擎:Goja[1]。它成功了ES 5.1的一切语法和大局部的ES 6语法,比Python 的execJS要凶猛得多。在必定水平上和特定场景下,它可以齐全代替Chrome 的 V8引擎。
咱们来看看如经常使用它运转一段 JavaScript 代码。首先,我来写一段递归版的 JavaScript 代码计算斐波那契数列:
function fib(n) {if (n === 1 || n === 2) {return 1}return fib(n - 1) + fib(n - 2)}
间接在阅读器下面运转的成果如下:
如今,咱们来装置这个Goja:
go get github.com/dop251/goja
接上去咱们在 Go 中运转 js 代码:
package mainimport ("fmt""github.com/dop251/goja")func main() {const script = `function fib(n) {if (n === 1 || n === 2) {return 1}return fib(n - 1) + fib(n - 2)}`vm := goja.New()_, err := vm.RunString(script)if err != nil {fmt.Println("JS代码有疑问!")return}var fn func(int32) int32err = vm.ExportTo(vm.Get("fib"), &fn)if err != nil {fmt.Println("Js函数映射到 Go 函数失败!")return}fmt.Println("斐波那契数列第30项的值为:", fn(30))}
运转成果如下图所示:
咱们来解释一下下面代码的意思。请大家关注截图中的代码行号。第19行,咱们创立了一个 JavaScript的虚构机。而后在第20行,把这个函数加载到了虚构机当中。
第25行,咱们创立了一个变量,这个变量是函数类型,这个函数接纳一个 int32作为参数,并前往另一个int32类型的数据。
第26行,咱们把 Golang 外面的这个函数变量与 JavaScript 外面的函数fib关联起来,这样咱们就能间接写 Go 代码来调用JavaScript 代码了。
第31行,咱们像调用普通的 Go 函数一样传入参数,而后取得结果。
有一些同窗在做爬虫的时刻,要求运转一段 JavaScript 代码来生成一段 token,那你无妨试一试Goja,它的速度必要求比你用Python版本的快很多。