最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Golang中運(yùn)行JavaScript

 更新時(shí)間:2022年01月26日 10:46:27   作者:kingname  
最近寫(xiě)一個(gè)程序,接口返回的數(shù)據(jù)是js格式的,需要通過(guò)golang來(lái)解析js,所以下面這篇文章主要給大家介紹了關(guān)于如何在Golang中運(yùn)行JavaScript的相關(guān)資料,需要的朋友可以參考下

我們知道,在 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)文章

  • Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解

    Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解

    這篇文章主要為大家介紹了Kubernetes上使用Jaeger分布式追蹤基礎(chǔ)設(shè)施詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Golang使用crypto/ed25519實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證

    Golang使用crypto/ed25519實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證

    本文將深入探討如何在?Golang?中使用?crypto/ed25519?進(jìn)行數(shù)字簽名和驗(yàn)證,我們將從基本原理開(kāi)始,逐步引導(dǎo)讀者了解生成密鑰對(duì)、進(jìn)行數(shù)字簽名,以及驗(yàn)證簽名的具體過(guò)程,希望對(duì)大家有所幫助
    2024-02-02
  • go語(yǔ)言中的log 包示例詳解

    go語(yǔ)言中的log 包示例詳解

    Go語(yǔ)言的log包提供了用于記錄日志的基本功能,相比f(wàn)mt包,增加了時(shí)間戳、日志級(jí)別等日志管理功能,非常適合用于調(diào)試和記錄運(yùn)行信息,本文呢介紹go語(yǔ)言中的log 包,感興趣的朋友一起看看吧
    2024-11-11
  • GoLang實(shí)現(xiàn)Viper庫(kù)的封裝流程詳解

    GoLang實(shí)現(xiàn)Viper庫(kù)的封裝流程詳解

    Viper是一個(gè)用于Go語(yǔ)言應(yīng)用程序的配置管理庫(kù),它提供了一種簡(jiǎn)單而靈活的方式來(lái)處理應(yīng)用程序的配置,支持多種格式的配置文件,這篇文章主要介紹了GoLang封裝Viper庫(kù)的流程,感興趣的同學(xué)可以參考下文
    2023-05-05
  • 詳解go-zero如何實(shí)現(xiàn)令牌桶限流

    詳解go-zero如何實(shí)現(xiàn)令牌桶限流

    令牌桶算法既能夠?qū)⑺械恼?qǐng)求平均分布到時(shí)間區(qū)間內(nèi),又能接受服務(wù)器能夠承受范圍內(nèi)的突發(fā)請(qǐng)求,因此是目前使用較為廣泛的一種限流算法,本文就來(lái)看看go-zero如何實(shí)現(xiàn)令牌桶限流的吧
    2023-08-08
  • 如何使用go實(shí)現(xiàn)創(chuàng)建WebSocket服務(wù)器

    如何使用go實(shí)現(xiàn)創(chuàng)建WebSocket服務(wù)器

    文章介紹了如何使用Go語(yǔ)言和gorilla/websocket庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的WebSocket服務(wù)器,并實(shí)現(xiàn)商品信息的實(shí)時(shí)廣播,感興趣的朋友一起看看吧
    2024-11-11
  • Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    Golang實(shí)現(xiàn)Redis事務(wù)深入探究

    這篇文章主要介紹了Golang實(shí)現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語(yǔ)言中排序的3種實(shí)現(xiàn)方法

    Go語(yǔ)言中排序的3種實(shí)現(xiàn)方法

    在寫(xiě)代碼過(guò)程中,排序是經(jīng)常會(huì)遇到的需求,這篇文章主要為大家介紹三種常用的方法,文中的示例代碼簡(jiǎn)潔易懂,需要的小伙伴可以參考下
    2023-08-08
  • go語(yǔ)言中的template使用示例詳解

    go語(yǔ)言中的template使用示例詳解

    在Go語(yǔ)言中,可以通過(guò)text/template和html/template包來(lái)處理模板,本文提供了一個(gè)使用Go模板的基本示例,包括導(dǎo)入包、創(chuàng)建數(shù)據(jù)結(jié)構(gòu)、定義模板、執(zhí)行模板及運(yùn)行程序,通過(guò)這些步驟,可以輸出一個(gè)格式化的YAML配置
    2024-10-10
  • Go語(yǔ)言題解LeetCode561數(shù)組拆分

    Go語(yǔ)言題解LeetCode561數(shù)組拆分

    這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode561數(shù)組拆分示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論

余江县| 竹山县| 周宁县| 天全县| 屏南县| 民县| 弋阳县| 筠连县| 石棉县| 西畴县| 大英县| 定结县| 通州区| 南昌县| 专栏| 兴文县| 新蔡县| 左云县| 陇西县| 湘潭县| 绍兴市| 阳春市| 海林市| 徐水县| 洛阳市| 汉阴县| 政和县| 邯郸县| 商都县| 亳州市| 新安县| 武冈市| 新化县| 遂溪县| 武川县| 景宁| 丹阳市| 邢台市| 彭水| 呼图壁县| 濉溪县|