教你如何在Golang中執行JavaScript
導讀 | 最近寫一個程式,介面返回的資料是js格式的,需要透過golang來解析js,所以下面這篇文章主要給大家介紹了關於如何在Golang中執行JavaScript的相關資料,需要的朋友可以參考下 |
我們知道,在 Python 裡面,如果你要執行一段 JavaScript,你可以使用execJS這種第三方庫。那麼在 Golang 裡面,你想執行 JavaScript 的時候又應該怎麼辦呢?
最近我發現一個使用 Golang 開發的 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行,我們建立了一個 JavaScript 的虛擬機器。然後在第20行,把這個函式載入到了虛擬機器當中。
第25行,我們建立了一個變數,這個變數是函式型別,這個函式接收一個 int32作為引數,並返回另一個int32型別的資料。
第26行,我們把 Golang 裡面的這個函式變數與 JavaScript 裡面的函式fib關聯起來,這樣我們就能直接寫 Go 程式碼來呼叫 JavaScript 程式碼了。
第31行,我們像呼叫普通的 Go 函式一樣傳入引數,然後獲得結果。
有一些同學在做爬蟲的時候,需要執行一段 JavaScript 程式碼來生成一段 token,那你不妨試一試Goja,它的速度肯定要比你用Python 版本的快很多。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2855480/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在JavaScript中實現某個方法執行超時後則繼續執行其它方法?JavaScript
- 如何在子執行緒中更新UI執行緒UI
- 如何在Docker容器中執行GUI程式DockerGUI
- JavaScript中的執行機制JavaScript
- 教你如何在 elasticsearch 中重建索引Elasticsearch索引
- JavaScript 中的執行上下文和執行棧JavaScript
- javascript中的自執行(立即執行)函式(function(){…})()JavaScript函式Function
- 如何在瀏覽器中執行 VS Code?瀏覽器
- 如何在程式碼中執行apk安裝APK
- Javascript中new的執行過程JavaScript
- JavaScript如何中斷迴圈執行?JavaScript
- JavaScript中的立即執行函式JavaScript函式
- 教你如何修改執行中的容器埠對映
- (譯文)JavaScript中的執行上下文和執行棧JavaScript
- [譯] 理解 JavaScript 中的執行上下文和執行棧JavaScript
- JavaScript中執行上下文和執行棧是什麼?JavaScript
- Javascript中的執行機制——Event LoopJavaScriptOOP
- 瞭解Javascript中的執行上下文和執行堆疊JavaScript
- 如何在Linux中執行MySQL/MariaDB查詢LinuxMySql
- 如何在 Linux 中以指令碼模式執行 TopLinux指令碼模式
- 如何在NotePad++中執行PHP程式碼?PHP
- 如何在MySQL中查詢OS執行緒id(LWP)?MySql執行緒
- Golang 使用執行命令帶管道符執行的方法Golang
- java執行javascriptJavaScript
- JavaScript中的JS引擎的執行機制JavaScriptJS
- 教你如何在 Ubuntu 中安裝 Oracle Java 13UbuntuOracleJava
- SpringBoot 專案如何在tomcat容器中執行Spring BootTomcat
- 如何在互動式環境中執行Python程式Python
- yii2.0檔案如何在php命令列中執行PHP命令列
- JavaScript執行環境與執行棧JavaScript
- golang執行緒池在IO多路複用中的應用Golang執行緒
- 教你如何優雅處理Golang中的異常Golang
- JavaScript中this的執行機制及爬坑指南JavaScript
- JavaScript 中 this 的執行機制及爬坑指南JavaScript
- golang workpool,工作池,執行緒池Golang執行緒
- JavaScript執行機制JavaScript
- Javascript 執行機制JavaScript
- 前端-JavaScript執行原理前端JavaScript