一日一技:在 Golang 中运行 JavaScript
摄影:产品经理
这个小黄鱼500多一份
我们知道,在 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 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)) }
运行效果如下图所示:

我们来解释一下上面代码的意思。请大家关注截图中的代码行号。第19行,我们创建了一个 JavaScript 的虚拟机。然后在第20行,把这个函数加载到了虚拟机当中。
第25行,我们创建了一个变量,这个变量是函数类型,这个函数接收一个 int32
作为参数,并返回另一个 int32
类型的数据。
第26行,我们把 Golang 里面的这个函数变量与 JavaScript 里面的函数 fib
关联起来,这样我们就能直接写 Go 代码来调用 JavaScript 代码了。
第31行,我们像调用普通的 Go 函数一样传入参数,然后获得结果。
有一些同学在做爬虫的时候,需要运行一段 JavaScript 代码来生成一段 token,那你不妨试一试 Goja
,它的速度肯定要比你用Python 版本的快很多。
参考文献
[1] Goja: https://github.com/dop251/goja
未闻 Code·知识星球开放啦!
一对一答疑爬虫相关问题
职业生涯咨询
面试经验分享
每周直播分享
......
未闻 Code·知识星球期待与你相见~
一二线大厂在职员工
十多年码龄的编程老鸟
国内外高校在读学生
中小学刚刚入门的新人
在 “未闻 Code技术交流群” 等你来!
入群方式:添加微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)
- 一日一技:如何批量给PDF添加水印?
- 一日一技:抛掉JavaScript,用HTML和Python做网站
- 一个让我感到 "细思极恐" 的开源项目!
- 一日一技:FastAPI 接口限流
- 5 分钟,使用内网穿透快速实现远程手机桌面!
- Python Delorean 优秀的时间格式智能转换工具
- 写在公众号粉丝2w时
- 一日一技:协程与多进程的完美结合
- 一个 "丧心病狂" 的开源项目
- python中如何优雅的实现代码与敏感信息分离?
- Pandas 多进程处理数据,速度快了不少!
- 爬虫出海Step by Step(一)
- 一日一知:架构到底是什么?
- Python识别花卉种类,并自动整理分类!
- 这几个摸鱼神器,你怎么能不知道
- FoolNLTK — 简单好用的中文NLP工具包
- 一日一知:国内爬虫开发人员的未来
- 我写论文时发现了哪些非常神的网站?
- Python 编程的最好搭档—VSCode 详细指南
- 一日一技:急速搭建问答搜索引擎