如何在Golang中執行JavaScript
我們知道,在 裡面,如果你要執行一段 ,你可以使用exec這種第三方庫。那麼在 裡面,你想執行 Script 的時候又應該怎麼辦呢?
最近我發現一個使用 Golang 開發的 JavaScript 引擎:Goja[1]。它實現了ES 5.1的所有語法和大部分的ES 6語法,比 Python 的execJS要厲害得多。在一定程度上和特定場景下,它可以完全替代Chrome 的 V8引擎。
我們來看看如使用它執行一段 JavaScript 程式碼。首先,我來寫一段遞迴版的 JavaScript 程式碼計算斐波那契數列:
functionfib(n){ if(n===1||n===2){ return1 } returnfib(n-1)+fib(n-2) }
直接在瀏覽器上面執行的效果如下:
現在,我們來安裝這個Goja:
goget.com/dop251/goja
接下來我們在 Go 中執行 js 程式碼:
packagemain import( "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)int32 err=vm.ExportTo(vm.Get("fib"),&fn) iferr!=nil{ fmt.Println("Js函式對映到 Go 函式失敗!") return } fmt.Println("斐波那契數列第30項的值為:",fn(30)) }
執行效果如下圖所示:
我們來解釋一下上GDnhGWVDsQ面程式碼的意思。請大家關注截圖客棧中的程式碼行號。第19行,我們建立了一個 JavaScript 的虛擬機器。然後在第20行,把這個函式載入到了虛擬機器當中。
第25行,我們建立了一個變數,這個變數是函式型別,這個函式接收一個int32作為引數,並返回另一個int32型別www.cppcns.com的資料。
第26行,我們把 Golang 裡面的這個函式變數與 JavaScript 裡面的函式fib關聯起來,這樣我們就能直接寫 Go 程式碼來呼叫 JavaScript 程式碼了。
第31行,我們像呼叫普通的 Go 函式一樣傳入引數,然後獲得結果。
有一些同學在做爬蟲的時候,需要執行一段 JavaScript 程式碼來生成一段 token,那你不妨試一試Goja,它的速度肯定要比你用Python 版本的快很多。
參考文獻
[1]Goja:https://github.com/dop251/goja
總結
到此這篇關於如何在Golang中執行JavaScript的文章就介紹到這了,更多相關Golang中執行JavaScript內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!