9

一日一技:在 Golang 中运行 JavaScript

 2 years ago
source link: https://www.kingname.info/2022/01/18/run-js-in-golang/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一日一技:在 Golang 中运行 JavaScript

发表于

2022-01-18

| 分类于 Golang

| 评论数: 0

我们知道,在 Python 里面,如果你要运行一段 JavaScript,你可以使用execJS这种第三方库。那么在 Golang 里面,你想运行 JavaScript 的时候又应该怎么办呢?

最近我发现一个使用 Golang 开发的 JavaScript 引擎:Goja。它实现了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)
}

直接在浏览器上面运行的效果如下:

20220118194307.png

现在,我们来安装这个Goja

go get github.com/dop251/goja

接下来我们在 Go 中运行 js 代码:

package main

import (
"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) int32
err = vm.ExportTo(vm.Get("fib"), &fn)
if err != nil {
fmt.Println("Js函数映射到 Go 函数失败!")
return
}
fmt.Println("斐波那契数列第30项的值为:", fn(30))
}

运行效果如下图所示:

20220118195256.png

我们来解释一下上面代码的意思。请大家关注截图中的代码行号。第19行,我们创建了一个 JavaScript 的虚拟机。然后在第20行,把这个函数加载到了虚拟机当中。

第25行,我们创建了一个变量,这个变量是函数类型,这个函数接收一个 int32作为参数,并返回另一个int32类型的数据。

第26行,我们把 Golang 里面的这个函数变量与 JavaScript 里面的函数fib关联起来,这样我们就能直接写 Go 代码来调用 JavaScript 代码了。

第31行,我们像调用普通的 Go 函数一样传入参数,然后获得结果。

有一些同学在做爬虫的时候,需要运行一段 JavaScript 代码来生成一段 token,那你不妨试一试Goja,它的速度肯定要比你用Python 版本的快很多。

谢乾坤 | Kingname wechat
第一时间获取最新文章更新,请订阅我的微信公众号:未闻Code

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK