Go中調(diào)用JS代碼(otto)的實(shí)現(xiàn)示例
otto是一個(gè)Go語言實(shí)現(xiàn)的JavaScript 解釋器,它的項(xiàng)目地址為:https://github.com/robertkrimen/otto
Otto實(shí)現(xiàn)了 ECMAScript 5.1 的大部分功能。你可以使用 Otto 來執(zhí)行 JavaScript 代碼,甚至可以定義和調(diào)用函數(shù),操作對(duì)象等。但請(qǐng)注意,Otto 目前只支持 ECMAScript 5.1,不支持 ECMAScript 6 或更高版本的功能。
假如我現(xiàn)在有一個(gè)encrypt.js的文件,里面的內(nèi)容為:
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function encodeInp(input) { var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64 } else if (isNaN(chr3)) { enc4 = 64 } output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = "" } while (i < input.length); return output }
這個(gè)文件里有一個(gè)函數(shù)是用來加密的(其實(shí)就是一個(gè)base64),然后當(dāng)我們寫爬蟲或者其他的東西時(shí)我們需要將這段代碼運(yùn)行一遍,并獲取其返回的值。
那么我們?cè)贕o中就可以這樣寫:
package main import ( "fmt" "github.com/robertkrimen/otto" "io/ioutil" ) func main() { filePath := "你的JS文件的路徑" //先讀入文件內(nèi)容 bytes, err := ioutil.ReadFile(filePath) if err != nil { panic(err) } vm := otto.New() _, err = vm.Run(string(bytes)) if err!=nil { panic(err) } data := "你需要傳給JS函數(shù)的參數(shù)" //encodeInp是JS函數(shù)的函數(shù)名 value, err := vm.Call("encodeInp", nil, data) if err != nil { panic(err) } fmt.Println(value.String()) }
然后假如你以后會(huì)經(jīng)常性的使用這段代碼的話,你也可以給它進(jìn)行一個(gè)小封裝。
func JsParser(filePath string, functionName string, args... interface{}) (result string) { //讀入文件 bytes, err := ioutil.ReadFile(filePath) if err!=nil { panic(err) } vm := otto.New() _, err = vm.Run(string(bytes)) if err!=nil { panic(err) } value, err := vm.Call(functionName, nil, args...) if err != nil { panic(err) } return value.String() }
其實(shí)otto還有很多有趣的功能,大家可以去otto的github項(xiàng)目里去看。
到此這篇關(guān)于Go中調(diào)用JS代碼(otto)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go調(diào)用JS代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang實(shí)現(xiàn)Viper庫的封裝流程詳解
Viper是一個(gè)用于Go語言應(yīng)用程序的配置管理庫,它提供了一種簡(jiǎn)單而靈活的方式來處理應(yīng)用程序的配置,支持多種格式的配置文件,這篇文章主要介紹了GoLang封裝Viper庫的流程,感興趣的同學(xué)可以參考下文2023-05-05golang中package?is?not?in?GOROOT報(bào)錯(cuò)的真正解決辦法
這篇文章主要給大家介紹了關(guān)于golang中package?is?not?in?GOROOT報(bào)錯(cuò)的真正解決辦法,文中通過圖文介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03Go pprof內(nèi)存指標(biāo)含義備忘錄及案例分析
這篇文章主要介紹了Go pprof內(nèi)存指標(biāo)含義備忘錄問題,小編特此把問題及案例分享到腳本之家平臺(tái)供大家學(xué)習(xí),需要的朋友可以參考下2020-03-03Golang實(shí)現(xiàn)http server提供壓縮文件下載功能
這篇文章主要介紹了Golang實(shí)現(xiàn)http server提供壓縮文件下載功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01golang微服務(wù)框架kratos實(shí)現(xiàn)Socket.IO服務(wù)的方法
本文主要介紹了golang微服務(wù)框架kratos實(shí)現(xiàn)Socket.IO服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Go語言CSP并發(fā)模型goroutine及channel底層實(shí)現(xiàn)原理
這篇文章主要為大家介紹了Go語言CSP并發(fā)模型goroutine?channel底層實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05