如何在Golang中运行JavaScript
作者:kingname 发布时间:2022-11-03 14:50:48
我们知道,在 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
来源:https://mp.weixin.qq.com/s/edEee9qsdQZrCPZIgJiEGQ


猜你喜欢
- 开发环境 android studio 3.0.1 已支持 kotlin1、定义接口interface CallBack{ fun call
- 本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下先说一下吧,android的自定义View就是
- 开发过程中会遇见很多app注册时,需要通过手机发送验证码验证 ,这是可以封装一个验证码按钮:attrs.xml<?xml versio
- Feign动态设置header和原理项目中用到了Feign做远程调用, 有部分场景需要动态配置header开始的做法是通过 @Request
- 本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个
- 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此。具体见下图。主要功能介绍如下:1)请求接口层。处理HTTP请求,及响应2
- 首先是创建redis-cluster文件夹:因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.16
- Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是
- 本文实例为大家分享了C#图像处理的具体代码,供大家参考,具体内容如下(1)在Form1窗体中的PictureBox1控件中显示通过OpenF
- 简介:任务并行库(Task Parellel Library)是BCL的一个类库,极大的简化了并行编程。使用任务并行库执行循环C#当中我们一
- C# 将js中的UNICODE转换为字符串,网上找的都不行,遇到有数字的转不出来,稍稍改了点,OK了!实例如下:/// 将Unicode编码
- Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以
- 将方形的图像映射到正方形上似乎并没有什么难度,所以接下来要做的是把图像映射到球面上。而球的参数方程为x=rcosϕcos&theta
- 背景WebView是在APP中,可以很方便的展示web页面,并且与web交互APP的数据。方便,并且更新内容无需APP发布新版本,只需要将最
- 前言在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果。那么有没有一种方式能够快速的、自动的帮我们将修改代码自动更新,避
- 有时我们会使用@Value自动注入,同时也存在注入到集合、数组等复杂类型的场景。这都是方便写 bug 的场景。1 @Value未注入预期值在
- 本文实例为大家分享了Viewpager2实现登录注册引导页面的具体代码,供大家参考,具体内容如下介绍屏幕滑动是两个完整屏幕之间的切换,在设置
- 本文以新建的CUDA的.cu程序来进行说明,同样也适用于C程序。一,发现问题1,首先我们在vs2019中创建了工程以后(我所创建的工程名称为
- JPA JpaRepository接口的使用SpringData的所有接口CrudRepository接口 ,其中提供了这些方法提供使用,同
- 网上android播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提