如何在Golang中運行JavaScript
我們知道,在 Python 里面,如果你要運行一段 JavaScript,你可以使用execJS這種第三方庫。那么在 Golang 里面,你想運行 JavaScript 的時候又應該怎么辦呢?
最近我發(fā)現一個使用 Golang 開發(fā)的 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)
}
直接在瀏覽器上面運行的效果如下:

現在,我們來安裝這個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))
}
運行效果如下圖所示:

我們來解釋一下上面代碼的意思。請大家關注截圖中的代碼行號。第19行,我們創(chuàng)建了一個 JavaScript 的虛擬機。然后在第20行,把這個函數加載到了虛擬機當中。
第25行,我們創(chuàng)建了一個變量,這個變量是函數類型,這個函數接收一個 int32作為參數,并返回另一個int32類型的數據。
第26行,我們把 Golang 里面的這個函數變量與 JavaScript 里面的函數fib關聯(lián)起來,這樣我們就能直接寫 Go 代碼來調用 JavaScript 代碼了。
第31行,我們像調用普通的 Go 函數一樣傳入參數,然后獲得結果。
有一些同學在做爬蟲的時候,需要運行一段 JavaScript 代碼來生成一段 token,那你不妨試一試Goja,它的速度肯定要比你用Python 版本的快很多。
參考文獻
[1] Goja: https://github.com/dop251/goja
總結
到此這篇關于如何在Golang中運行JavaScript的文章就介紹到這了,更多相關Golang中運行JavaScript內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Kubernetes上使用Jaeger分布式追蹤基礎設施詳解
這篇文章主要為大家介紹了Kubernetes上使用Jaeger分布式追蹤基礎設施詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Golang使用crypto/ed25519實現數字簽名和驗證
本文將深入探討如何在?Golang?中使用?crypto/ed25519?進行數字簽名和驗證,我們將從基本原理開始,逐步引導讀者了解生成密鑰對、進行數字簽名,以及驗證簽名的具體過程,希望對大家有所幫助2024-02-02
如何使用go實現創(chuàng)建WebSocket服務器
文章介紹了如何使用Go語言和gorilla/websocket庫創(chuàng)建一個簡單的WebSocket服務器,并實現商品信息的實時廣播,感興趣的朋友一起看看吧2024-11-11

