写在前面
本文是《go执行js代码引擎系列》文章之第二篇,其他相关文章如下
otto
一个 Go 语言编写的 JavaScript 解释器,支持 ES5 规范,能够执行 JavaScript 代码并获取结果。它的使用非常简单,可以通过 otto.New()
方法创建一个新的解释器对象,然后通过 Run()
方法执行 JavaScript 代码,最后通过 Value()
方法获取执行结果
基本用法
package main
import (
"fmt"
"github.com/robertkrimen/otto"
"go-js/common"
"os"
)
func main() {
filePath := os.Args[1]
jsData, err := common.ReadFile(filePath)
if err != nil {
panic(err)
}
vm := otto.New()
// 执行js代码
value, err := vm.Run(jsData)
if err != nil {
panic(err)
} else {
if result, err := value.ToInteger(); err != nil {
panic(err)
} else {
fmt.Printf("result:%d\n", result)
}
}
// go获取js变量
a, err := vm.Get("a")
if err != nil {
panic(err)
} else {
if result, err := a.ToInteger(); err != nil {
panic(err)
} else {
fmt.Printf("a:%d\n", result)
}
}
}
执行:go run main.go ../data/add.js
var a = 2
var b = 3
result = a+b
输出:result:5 a:2
js获取go变量,执行go函数
package main
import (
"fmt"
"github.com/robertkrimen/otto"
"go-js/common"
"os"
)
type Person struct {
Name string
Age int64
}
func main() {
filePath := os.Args[1]
jsData, err := common.ReadFile(filePath)
if err != nil {
panic(err)
}
vm := otto.New()
// 设置变量
p := Person{
Name: "张三",
Age: 19,
}
vm.Set("p", p)
// 设置函数
vm.Set("visit", visit)
// 执行js代码
value, err := vm.Run(jsData)
if err != nil {
panic(err)
} else {
if result, err := value.ToString(); err != nil {
panic(err)
} else {
fmt.Printf("result:%s\n", result)
}
}
}
func visit(p Person, newAge int) string {
return fmt.Sprintf("name:%s, oldAge:%d,newAge:%d", p.Name, p.Age, newAge)
}
执行:go run main.go ../data/call_go_func.js
// p是go对象,123是js变量
var a = 123
visit(p, a)
输出:result:name:张三, oldAge:19,newAge:123
参考
[1]源码