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脚本

  1. 下载Gentee编译器二进制版本或从源代码构建:
$ go get -u github.com/gentee/gentee
$ cd gentee/gentee/cli
$ go build
  1. 运行脚本:
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
}

性能优化建议

  1. 预编译频繁使用的脚本
  2. 复用工作空间对象
  3. 限制脚本执行时间和资源使用
  4. 对复杂脚本进行模块化

Gentee 是一个强大而灵活的嵌入式脚本解决方案,特别适合需要安全执行用户提供逻辑的 Go 应用程序。它的简单语法和与 Go 的良好集成使其成为许多场景下的理想选择。

回到顶部