阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

教你如何在Golang中运行JavaScript

35次阅读
没有评论

共计 1249 个字符,预计需要花费 4 分钟才能阅读完成。

导读 最近写一个程序, 接口返回的数据是 js 格式的, 需要通过 golang 来解析 js, 所以下面这篇文章主要给大家介绍了关于如何在 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)
}

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

教你如何在 Golang 中运行 JavaScript

现在,我们来安装这个 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))
}

运行效果如下图所示:
教你如何在 Golang 中运行 JavaScript

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

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

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

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

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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1249字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中