Tengo脚本语言在Go项目中的嵌入使用
在Go项目中嵌入Tengo脚本语言时,如何实现高效的脚本与宿主代码的交互?具体想了解:
- 性能开销如何,有无优化建议?
- 脚本如何安全地调用Go函数或访问Go变量?
- 是否有并发执行脚本的最佳实践?
- 实际项目中常见的坑和解决方案有哪些?
2 回复
在Go项目中,可通过plugin包或第三方库(如go-lua)嵌入脚本语言。例如,使用github.com/yuin/gopher-lua运行Lua脚本,实现动态逻辑扩展。适合配置解析、插件系统等场景。
Tengo是一种轻量级的脚本语言,专为Go语言设计,可以在Go应用程序中嵌入使用。它语法类似Go,支持动态类型,适用于配置、规则引擎或插件系统等场景。
基本使用步骤:
-
安装Tengo:
使用Go模块安装:go get github.com/d5/tengo/v2 -
编写Tengo脚本:
脚本可以是字符串或文件。例如:script := ` multiply := func(a, b) { return a * b } result := multiply(5, 3) ` -
在Go中执行脚本:
package main import ( "fmt" "github.com/d5/tengo/v2" ) func main() { script := tengo.NewScript([]byte(script)) // 执行脚本 compiled, err := script.Run() if err != nil { panic(err) } // 获取结果 result := compiled.Get("result") fmt.Println(result.Int()) // 输出: 15 } -
与Go交互:
可以通过变量或函数在Go和Tengo间传递数据:script := tengo.NewScript([]byte(`result := external + 10`)) _ = script.Add("external", 5) // 从Go传入变量 compiled, _ := script.Run() fmt.Println(compiled.Get("result").Int()) // 输出: 15
应用场景:
- 动态配置:允许用户通过脚本修改应用行为。
- 扩展逻辑:在不重新编译的情况下添加新功能。
- 规则引擎:执行用户自定义的业务规则。
注意事项:
- 确保脚本来源可信,避免执行恶意代码。
- 性能敏感场景需测试,因Tengo是解释型语言。
通过Tengo,可以灵活扩展Go应用,适合需要动态性的场景。

