在Go程序中嵌入ZGG脚本
如何集成ZGG?
第一步:安装依赖库
go get github.com/zgg-lang/zgg-go第二步:参考下面例子完成代码集成
1.简单使用Demo(展示一下核心接口的用法)
package main
import (
"fmt"
"github.com/zgg-lang/zgg-go"
)
const demoModule = `
fib := n => when n {
1, 2 -> 1
else -> fib(n - 1) + fib(n - 2)
}
export result := fib(n)
`
const demoExpr = `n ** 2`
func main() {
// 使用源码运行模块
if exported, err := zgg.RunCode(demoModule, zgg.Var{"n", zgg.Val{10}}); err != nil {
panic(err)
} else {
fmt.Println("module exported result:", exported["result"].(int64))
}
// 使用预编译结果运行模块
if compiled, err := zgg.CompileCode(demoModule); err != nil {
panic(err)
} else if exported, err := zgg.RunCode(compiled, zgg.Var{"n", zgg.Val{10}}); err != nil {
panic(err)
} else {
fmt.Println("module exported result:", exported["result"].(int64))
}
// 使用源码进行表达式求值
if result, err := zgg.Eval(demoExpr, zgg.Var{"n", zgg.Val{10}}); err != nil {
panic(err)
} else {
fmt.Println("expr result:", result.(int64))
}
// 使用预编译结果进行表达式求值
if compiled, err := zgg.CompileExpr(demoModule); err != nil {
panic(err)
} else if result, err := zgg.Eval(compiled, zgg.Var{"n", zgg.Val{10}}); err != nil {
panic(err)
} else {
fmt.Println("expr result:", result.(int64))
}
}2. 调用Go方法和对象
核心接口说明:
func RunCode(script interface{}, opts ...ExecOption) (exported map[string]interface{}, err error)
func Eval(expr interface{}, opts ...ExecOption) (interface{}, error)
func CompileCode(code interface{}) (compiled ast.Node, err error)
func CompileExpr(code interface{}) (ast.Node, error)
最后更新于