golang嵌入式脚本编程语言插件库gentee的使用
Golang嵌入式脚本编程语言插件库Gentee的使用
Gentee是一种免费开源的脚本编程语言,专为在计算机上创建自动化重复动作和流程的脚本而设计。如果您使用或计划使用.bat文件、bash、PowerShell或其他特殊程序来自动化操作,可以尝试使用Gentee来实现相同的功能。
Go集成
您可以在golang项目中无限制地使用Gentee编译器和虚拟机。下面是一个完整的Go集成示例:
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
// 创建Gentee工作空间
workspace := gentee.New()
// 定义一个简单的Gentee脚本
script := `
func main() {
return "Hello from Gentee!"
}
`
// 编译脚本
exec, err := workspace.Compile(script, ``)
if err != nil {
fmt.Println("编译错误:", err)
return
}
// 运行脚本
result, err := workspace.Run(exec)
if err != nil {
fmt.Println("运行时错误:", err)
return
}
// 输出结果
fmt.Println(result)
}
如何运行Gentee脚本
- 下载Gentee编译器二进制版本或从源代码构建:
$ go get -u github.com/gentee/gentee
$ cd gentee/gentee/cli
$ go build
- 运行脚本:
Linux: ./gentee myscript.g
Windows: gentee.exe myscript.g
Gentee编译器/解释器
基本使用语法:
gentee [-ver] [-t] <scriptname> [command-line parameters for script]
命令行参数
- scriptname - 脚本文件的完整或相对路径。可以在脚本文件名后指定脚本的命令行参数。
- -ver - 显示Gentee语言的当前版本。
- -t - 测试脚本。使用此参数时,脚本必须在头部包含带有预期值的result参数。
错误代码
代码 | 描述 |
---|---|
1 | 未找到脚本文件 |
2 | 编译错误 |
3 | 运行时错误 |
4 | 使用**-t**参数启动时结果错误 |
示例脚本
下面是一个简单的Gentee脚本示例,演示基本功能:
// 这是一个简单的Gentee脚本示例
// result = "3.141592653589793"
func main() {
// 定义变量
pi = 3.141592653589793
name = "Gentee"
// 输出信息
print("Welcome to", name)
print("The value of pi is", str(pi))
// 返回结果
return pi
}
在Go中嵌入Gentee的更复杂示例
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
// 初始化Gentee工作空间
ws := gentee.New()
// 注册自定义Go函数到Gentee
err := ws.RegisterFunc("add", addFunc)
if err != nil {
fmt.Println("注册函数错误:", err)
return
}
// 定义使用自定义函数的Gentee脚本
script := `
func main() {
a = 5
b = 7
return add(a, b)
}
`
// 编译并运行脚本
exec, err := ws.Compile(script, "")
if err != nil {
fmt.Println("编译错误:", err)
return
}
result, err := ws.Run(exec)
if err != nil {
fmt.Println("运行时错误:", err)
return
}
fmt.Println("脚本结果:", result)
}
// 自定义Go函数,可在Gentee脚本中调用
func addFunc(params ...interface{}) interface{} {
a := params[0].(int64)
b := params[1].(int64)
return a + b
}
支持
如果您有任何问题、建议或希望参与开发,可以提交issue。
许可证
MIT License
版权所有 © 2018-present, Alexey Krivonogov
更多关于golang嵌入式脚本编程语言插件库gentee的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang嵌入式脚本编程语言插件库gentee的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Gentee - Go 嵌入式脚本语言插件库
Gentee 是一个轻量级的 Go 嵌入式脚本语言,它允许你在 Go 应用程序中嵌入脚本功能。Gentee 脚本语法简单,执行速度快,特别适合需要动态执行用户提供逻辑的场景。
主要特性
- 简单易学的脚本语法
- 与 Go 无缝集成
- 高性能执行
- 类型安全
- 支持协程
- 内置标准库
安装
go get github.com/gentee/gentee
基本使用示例
1. 执行简单脚本
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
// 创建 Gentee 工作空间
workspace := gentee.New()
// 执行简单脚本
result, err := workspace.Run(`"Hello, Gentee!"`, nil)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result) // 输出: Hello, Gentee!
}
2. 使用变量和函数
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
workspace := gentee.New()
script := `
func add(a int, b int) int {
return a + b
}
x = 5
y = 7
add(x, y)
`
result, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result) // 输出: 12
}
3. 与 Go 交互
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
workspace := gentee.New()
// 注册 Go 函数供脚本调用
err := workspace.RegisterFunc("double", func(i int64) int64 {
return i * 2
})
if err != nil {
fmt.Println("Error registering function:", err)
return
}
script := `
x = 10
double(x)
`
result, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result) // 输出: 20
}
4. 处理复杂数据结构
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
workspace := gentee.New()
script := `
func process(data map) map {
data["processed"] = true
data["value"] *= 2
return data
}
input = {"value": 5, "name": "test"}
process(input)
`
result, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("%+v\n", result)
// 输出: map[name:test processed:true value:10]
}
5. 错误处理
package main
import (
"fmt"
"github.com/gentee/gentee"
)
func main() {
workspace := gentee.New()
script := `
func divide(a int, b int) int {
if b == 0 {
error("division by zero")
}
return a / b
}
divide(10, 0)
`
_, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Script error:", err)
// 输出: Script error: division by zero (line 4)
}
}
高级特性
协程支持
package main
import (
"fmt"
"time"
"github.com/gentee/gentee"
)
func main() {
workspace := gentee.New()
script := `
func worker(id int) {
for i in 1..5 {
sleep(100) // 毫秒
println("Worker $$id: $$i")
}
}
go worker(1)
go worker(2)
sleep(1000)
`
_, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Error:", err)
}
// 输出两个worker交替执行的日志
time.Sleep(2 * time.Second)
}
自定义类型
package main
import (
"fmt"
"github.com/gentee/gentee"
)
type Person struct {
Name string
Age int
}
func main() {
workspace := gentee.New()
// 注册自定义类型
err := workspace.RegisterType("Person", Person{})
if err != nil {
fmt.Println("Error registering type:", err)
return
}
// 注册构造函数
err = workspace.RegisterFunc("newPerson", func(name string, age int64) Person {
return Person{Name: name, Age: int(age)}
})
if err != nil {
fmt.Println("Error registering function:", err)
return
}
script := `
p = newPerson("Alice", 30)
p.Name + " is " + str(p.Age) + " years old"
`
result, err := workspace.Run(script, nil)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result) // 输出: Alice is 30 years old
}
性能优化建议
- 预编译频繁使用的脚本
- 复用工作空间对象
- 限制脚本执行时间和资源使用
- 对复杂脚本进行模块化
Gentee 是一个强大而灵活的嵌入式脚本解决方案,特别适合需要安全执行用户提供逻辑的 Go 应用程序。它的简单语法和与 Go 的良好集成使其成为许多场景下的理想选择。