当前位置: 首页 > article >正文

golang中的eval,goeval,govaluate

在解释型语言中基本都提供了 eval() 函数,将字符串当做代码来执行。而golang并没有提供此方法。我在编写计算器桌面应用的时候发现,必须要有 eval 函数才能实现。

PaulXu-cn/goeval

https://github.com/PaulXu-cn/goeval

在临时目录os.TempDir()下创建随机目录,然后创建main.go文件,填充go源码,运行完然后将其删掉,获取stdout信息。

// github.com/PaulXu-cn/goeval
func Eval(defineCode string, code string, imports ...string) (re []byte, err error)

第一个参数填入自定义的变量/函数/结构体等。

第二个参数是代码字符串。

第三个参数是本代码依赖了哪些包,可以是标准库,也可以是第三方包。

func t11() {
	res, err := goeval.Eval("", "fmt.Println(3*(1+2))", "fmt")
	fmt.Println(string(res), err)
}

func t12() {
	res, err := goeval.Eval("", `line := "3*(1+1)"
	expr, _ := govaluate.NewEvaluableExpression(line)
	result, _ := expr.Evaluate(nil)
	fmt.Println(result)`, "fmt", "github.com/Knetic/govaluate")
	fmt.Println(string(res), err)
}

代码格式化:因为Go有些地方对format有要求,比如定义函数的时候左大括号不能换行,使用go/format来进行格式化。

go.mod 的处理:如果引入了标准库以外的包,就需要初始化go.mod文件,但是PaulXu-cn/goeval没有这个操作,代码也能正常运行,主要是因为,这是在当前项目下运行一个tmp项目下的main.go,于是go命令会检查当前项目下的go.mod,而不是tmp项目下的go.mod,而在当前项目下我实际上也在使用github.com/Knetic/govaluate包,这就导致可以正常运行,但是,如果 eval 代码串中引入的包,在当前项目下并没有用到,就会报错,这个时候你可以使用下划线语法将其引入。

xtaci/goeval

https://github.com/xtaci/goeval

此项目式借助 go/ast, go/parser解析抽象语法树来实现的。

func t2() {
	s := evalhandle.NewScope()
	s.Set("print", fmt.Println)
	fmt.Println(s.Eval(`count := 0`))
	fmt.Println(s.Eval(`for i:=0; i<10; i++ { 
			count=count+i
		}`))
	fmt.Println(s.Eval(`print(count)`))
}
Knetic/govaluate

https://github.com/Knetic/govaluate

计算一个表达式的值并得到返回结果。

func t3() {
	line := "3*(1+2)"
	expr, _ := govaluate.NewEvaluableExpression(line)
	result, _ := expr.Evaluate(nil)
	fmt.Println(result) // 9
}

最终使用了govaluate完成了计算器的开发。


http://www.kler.cn/a/500598.html

相关文章:

  • 插入实体自增主键太长,mybatis-plaus自增主键
  • 计算机网络之---网络层的基本功能
  • 后端服务集成ElasticSearch搜索功能技术方案
  • 新活动平台建设历程与架构演进
  • 油猴支持阿里云自动登陆插件
  • C语言期末回忆
  • 智能风控/数据分析 聚合 分组 连接
  • LeetCode-找出字符串中第一个匹配项的下标(028)
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Golang笔记——channel
  • 软件系统分析与设计综合实践-家庭维修服务系统小程序(代码见附录,私发)
  • Xcode 正则表达式实现查找替换
  • JVM之垃圾回收器概述(续)的详细解析
  • 【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
  • 【Spring Boot 应用开发】-04 自动配置-数据源
  • 【优选算法篇】:深入浅出位运算--性能优化的利器
  • EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)
  • 金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成
  • PHP语言的软件工程
  • VSCode配置php开发环境
  • Microsoft Sql Server 2019 视图
  • 第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基础设施耐久性国际学术会议(CADPC DuraBI 2025)
  • 33_操作Redis分片集群
  • 用C语言实现推箱子小游戏
  • windows C#-泛型方法
  • Python----Python基础(字符串,列表,元组,字典,集合的总结)