教你如何在Golang中執行JavaScript

大雄45發表於2022-03-06
導讀 最近寫一個程式,介面返回的資料是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)
}

直接在瀏覽器上面執行的效果如下:

教你如何在Golang中執行JavaScript教你如何在Golang中執行JavaScript

現在,我們來安裝這個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))
}

執行效果如下圖所示:
教你如何在Golang中執行JavaScript教你如何在Golang中執行JavaScript

我們來解釋一下上面程式碼的意思。請大家關注截圖中的程式碼行號。第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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章