Go Eval 库
Golang
的 eval()
函数第三方实现。
背景
众所周知,Golang
是一门静态语言,笔者作为动态语言转过来的老同志(别猜了我是phper),习惯了用 eval()
就想着Go 动态执行代码呢。
如何在 golang
中使用 eval()
函数,php
,javascript
自带该功能。golang 官方是没有提供相关库的。
在丰富的Go第三方生态中,着实没找到相关的库。倒是看到有人做了一个demo 挂到博客。我就来拿来改改,做成了一个库,望广大 gopher
用的满意。
安装
$ go get github.com/PaulXu-cn/goeval
功能介绍
这个 goeval 库,传入 golang
代码字符串,然后执行 eval()
函数,就能获得该 字符串代码
输出到 stdout
上的内容。
使用例子:
package main
import (
"fmt"
"github.com/PaulXu-cn/goeval"
)
func main() {
if re, err := goeval.Eval(
"",
"fmt.Print(\"Hello http://blog.itjsz.com\")",
"fmt"); nil == err {
fmt.Print(string(re))
} else {
fmt.Print(err.Error())
}
}
输出:
Hello http://blog.itjsz.com
这里我们引入了 goeval
包,调用它的 Eval 函数,第一个参数是,结构体定义代码(由于代码中没有有用自定义结构体,所有这里传空), 第二个字符串是要执行的代码,第三及以后的字符串是import的包。
实现细则
- 按照传入的字符串构建整个运行代码的字符串
- 格式化代码,主要是删除未使用 包,所以
import
的包可以多,但不能少。 - 在
tmp
目录下随机创建一个目录,并进入 - 在刚创建目录里创建
main.go
文件 - 写入格式化后的代码
- 运行
go run main.go
并收集stdout
- 删除创建的文件夹以及
main.go
- 返回 stdout
参考
- https://golangtc.com/t/55b4ef18b09ecc22f6000219