新聞中心
最近我發(fā)現(xiàn)一個(gè)使用 Golang 開(kāi)發(fā)的 JavaScript 引擎:Goja[1]。它實(shí)現(xiàn)了ES 5.1的所有語(yǔ)法和大部分的ES 6語(yǔ)法,比 Python 的execJS要厲害得多。在一定程度上和特定場(chǎng)景下,它可以完全替代Chrome 的 V8引擎。

為敦煌等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及敦煌網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、敦煌網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
我們來(lái)看看如使用它運(yùn)行一段 JavaScript 代碼。首先,我來(lái)寫(xiě)一段遞歸版的 JavaScript 代碼計(jì)算斐波那契數(shù)列:
function fib(n) {
if (n === 1 || n === 2) {
return 1
}
return fib(n - 1) + fib(n - 2)
}
直接在瀏覽器上面運(yùn)行的效果如下:
現(xiàn)在,我們來(lái)安裝這個(gè)Goja:
go get github.com/dop251/goja
接下來(lái)我們?cè)?Go 中運(yùn)行 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代碼有問(wèn)題!")
return
}
var fn func(int32) int32
err = vm.ExportTo(vm.Get("fib"), &fn)
if err != nil {
fmt.Println("Js函數(shù)映射到 Go 函數(shù)失敗!")
return
}
fmt.Println("斐波那契數(shù)列第30項(xiàng)的值為:", fn(30))
}
運(yùn)行效果如下圖所示:
我們來(lái)解釋一下上面代碼的意思。請(qǐng)大家關(guān)注截圖中的代碼行號(hào)。第19行,我們創(chuàng)建了一個(gè) JavaScript 的虛擬機(jī)。然后在第20行,把這個(gè)函數(shù)加載到了虛擬機(jī)當(dāng)中。
第25行,我們創(chuàng)建了一個(gè)變量,這個(gè)變量是函數(shù)類型,這個(gè)函數(shù)接收一個(gè) int32作為參數(shù),并返回另一個(gè)int32類型的數(shù)據(jù)。
第26行,我們把 Golang 里面的這個(gè)函數(shù)變量與 JavaScript 里面的函數(shù)fib關(guān)聯(lián)起來(lái),這樣我們就能直接寫(xiě) Go 代碼來(lái)調(diào)用 JavaScript 代碼了。
第31行,我們像調(diào)用普通的 Go 函數(shù)一樣傳入?yún)?shù),然后獲得結(jié)果。
有一些同學(xué)在做爬蟲(chóng)的時(shí)候,需要運(yùn)行一段 JavaScript 代碼來(lái)生成一段 token,那你不妨試一試Goja,它的速度肯定要比你用Python 版本的快很多。
來(lái)源鏈接:
??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??
本文標(biāo)題:如何在Golang中運(yùn)行JavaScript
分享URL:http://m.5511xx.com/article/djgejje.html


咨詢
建站咨詢
