go 执行js代码引擎系列之二:otto库


写在前面

本文是《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]源码


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录