otto是一个go语言实现的javascript 解释器,它的项目地址为:https://github.com/robertkrimen/otto
otto实现了 ecmascript 5.1 的大部分功能。你可以使用 otto 来执行 javascript 代码,甚至可以定义和调用函数,操作对象等。但请注意,otto 目前只支持 ecmascript 5.1,不支持 ecmascript 6 或更高版本的功能。
假如我现在有一个encrypt.js的文件,里面的内容为:
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 }
这个文件里有一个函数是用来加密的(其实就是一个base64),然后当我们写爬虫或者其他的东西时我们需要将这段代码运行一遍,并获取其返回的值。
那么我们在go中就可以这样写:
package main import ( "fmt" "github.com/robertkrimen/otto" "io/ioutil" ) func main() { filepath := "你的js文件的路径" //先读入文件内容 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函数的参数" //encodeinp是js函数的函数名 value, err := vm.call("encodeinp", nil, data) if err != nil { panic(err) } fmt.println(value.string()) }
然后假如你以后会经常性的使用这段代码的话,你也可以给它进行一个小封装。
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() }
其实otto还有很多有趣的功能,大家可以去otto的github项目里去看。
到此这篇关于go中调用js代码(otto)的实现示例的文章就介绍到这了,更多相关go调用js代码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论