如何在Golang中運(yùn)行JavaScript
我們知道,在 Python 里面,如果你要運(yùn)行一段 JavaScript,你可以使用execJS這種第三方庫(kù)。那么在 Golang 里面,你想運(yùn)行 JavaScript 的時(shí)候又應(yīng)該怎么辦呢?
最近我發(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引擎。
我們來(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ù)類(lèi)型,這個(gè)函數(shù)接收一個(gè) int32作為參數(shù),并返回另一個(gè)int32類(lèi)型的數(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 版本的快很多。
參考文獻(xiàn)
[1] Goja: https://github.com/dop251/goja
總結(jié)
到此這篇關(guān)于如何在Golang中運(yùn)行JavaScript的文章就介紹到這了,更多相關(guān)Golang中運(yùn)行JavaScript內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02golang gopm get -g -v 無(wú)法獲取第三方庫(kù)的解決方案
這篇文章主要介紹了golang gopm get -g -v 無(wú)法獲取第三方庫(kù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05go語(yǔ)言發(fā)送smtp郵件的實(shí)現(xiàn)示例
這篇文章主要介紹了go發(fā)送smtp郵件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09golang channel讀取數(shù)據(jù)的幾種情況
本文主要介紹了golang channel讀取數(shù)據(jù)的幾種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解
經(jīng)過(guò)前面的幾節(jié)對(duì)pprof的介紹,對(duì)pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒(méi)有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來(lái)分析下這部分2023-04-04