最近寫一個(gè)程序便脊,接口返回的數(shù)據(jù)是js格式的,需要通過(guò)golang來(lái)解析js根灯,so 找到了一個(gè)好用的庫(kù)otto
使用起來(lái)簡(jiǎn)單毕源,函數(shù)就三個(gè)
先執(zhí)行vm:=otto.New()
生成一個(gè)javascript運(yùn)行環(huán)境岸更,
然后執(zhí)行vm.Run("js code")
來(lái)執(zhí)行js代碼
demo實(shí)現(xiàn)golang和javascript的互相調(diào)用
demo1 輸入javascript變量abc
demo2 調(diào)用javascript函數(shù)hello
demo3 javascript調(diào)用golang函數(shù)add
package main
import (
"fmt"
"github.com/robertkrimen/otto"
)
func main() {
fmt.Println("1.print javascript variables")
vm := otto.New()
vm.Run(`
abc = 2 + 2;
console.log("The value of abc is " + abc); // 4
`)
if value, err := vm.Get("abc"); err == nil {
if value_int, err := value.ToInteger(); err == nil {
fmt.Println(value_int)
}
}
fmt.Println("\n2.call javascript function")
vm.Run(`
function hello(name){
console.log('hello ' + name)
return 'OK'
}
`)
ret, _ := vm.Call("hello", nil, "zhangsan")
fmt.Println(ret)
fmt.Println("\n3.call go func")
vm.Set("add", func(call otto.FunctionCall) otto.Value {
fmt.Println("call from js")
arg1, _ := call.Argument(0).ToInteger()
arg2, _ := call.Argument(1).ToInteger()
result, _ := vm.ToValue(arg1 + arg2)
return result
})
vm.Run(`
sum = add(1,10);
console.log('sum: ' + sum);
`)
}