当前位置: 首页 > 科技观察

如何在Golang中运行JavaScript

时间:2023-03-19 01:01:44 科技观察

我们知道在Python中,如果要运行一段JavaScript,可以使用execJS等第三方库。那么在Golang中,想要运行JavaScript应该怎么办呢?最近发现一个用Golang开发的JavaScript引擎:Goja[1]。它实现了ES5.1的所有语法和ES6的大部分语法,比Python的execJS强大得多。在一定程度上和特定场景下,它可以完全替代Chrome的V8引擎。让我们看看如何使用它来运行一段JavaScript代码。首先,让我编写一个递归的JavaScript代码来计算斐波那契数列:functionfib(n){if(n===1||n===2){return1}returnfib(n-1)+fib(n-2)}直接在浏览器运行效果如下:现在,我们安装这个Goja:gogetgithub.com/dop251/goja接下来我们运行Go中的js代码:packagemainimport("fmt""github.com/dop251/goja")funcmain(){constscript=`functionfib(n){if(n===1||n===2){return1}returnfib(n-1)+fib(n-2)}`vm:=goja.New()_,err:=vm.RunString(script)iferr!=nil{fmt.Println("JS代码有问题!")return}varfnfunc(int32)int32err=vm.ExportTo(vm.Get("fib"),&fn)iferr!=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