社区编辑申请
注册/登录
如何在 Golang 中运行 JavaScript
开发 前端
我们知道,在 Python 里面,如果你要运行一段 JavaScript,你可以使用execJS这种第三方库。那么在 Golang 里面,你想运行 JavaScript 的时候又应该怎么办呢?

我们知道,在 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 版本的快很多。

来源链接:

​http://mp.weixin.qq.com/s?__biz=MzI2MzEwNTY3OQ==&mid=2648984382&idx=1&sn=83511845f226b84678415e137e82fc93&chksm=f25016dec5279fc8755809e1e3d7dd51d760f73a2bde8123f51b13f6c300b8de7011a9742c4d&mpshare=1&scene=23&srcid=0118l7VER7fPhaIk3wWGbNlu&sharer_sharetime=1642509422986&sharer_shareid=9603544ecd5d7f3dc66603ae089636f4#rd​

责任编辑:赵宁宁 来源: 未闻Code
相关推荐

2022-01-05 08:00:00

框架Golang开源

2022-02-09 07:52:36

2022-04-13 08:23:31

Golang并发

2022-05-03 22:25:57

Python浏览器语言

2019-11-28 15:00:47

GolangPlan9汇编

2022-02-20 23:15:46

gRPCGolang语言

2022-04-24 16:00:15

LinuxLinux命令ls命令

2022-02-07 23:07:19

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-05-09 15:43:34

JavaScriptRust开发

2022-04-14 10:10:59

Nginx开源Linux

2022-04-13 09:28:19

JavaScripiframe开发

2022-04-10 23:02:08

GoRust语言

2022-03-30 08:40:00

JavaScript控制台

2020-10-27 18:45:45

GolangGraphQ开发

2022-03-30 18:18:33

GolangTiDB数据库

2022-04-27 09:48:56

JS前端开发

2022-04-20 15:37:54

恶意软件漏洞恶意代码

2022-04-26 10:11:16

开发工具JavaScript

2022-04-13 08:00:00

Hilla开发Java

同话题下的热门内容

有人问,如何找到适合的Python库?Python 字符串总结,建议收藏!突发!Gitee宣布仓库开源必须人工审核,「中国Github」要无了?让程序员心动的11种新编程语言为什么说Python是数据科学领域的最佳语言?软件开发生命周期(SDLC)完全指南风口上的低代码,技术人需要考虑哪些?技术迷途者指南:我有问题,你有解吗?丨T群话

编辑推荐

2017年9月编程语言排行榜:Java、C与C++三巨头还能统治排行榜多久?2017年最受欢迎的5个前端框架比较2017年11月编程语言排行榜:脚本语言怎么了?2017年3月编程语言排行榜:Swift首次进入前十最近租房有点烦!技术人如何用Python找到称心如意的“小窝”?
我收藏的内容
点赞
收藏

51CTO技术栈公众号