有了它,Golang 也能 Eval 了

Golang
556
0
0
2022-04-20

Go Eval 库

Golangeval() 函数第三方实现。

go eval

背景

众所周知,Golang 是一门静态语言,笔者作为动态语言转过来的老同志(别猜了我是phper),习惯了用 eval() 就想着Go 动态执行代码呢。

如何在 golang 中使用 eval() 函数,phpjavascript 自带该功能。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 World itjsz.com\")","fmt"); nil == err {
        fmt.Print(string(re))} else {
        fmt.Print(err.Error())}
}

输出:

Hello World itjsz.com

这里我们引入了 goeval 包,调用它的 Eval 函数,第一个参数是,结构体定义代码(由于代码中没有有用自定义结构体,所有这里传空), 第二个字符串是要执行的代码,第三及以后的字符串是import的包。

实现细则

  1. 按照传入的字符串构建整个运行代码的字符串
  2. 格式化代码,主要是删除未使用 包,所以 import 的包可以多,但不能少。
  3. tmp 目录下随机创建一个目录,并进入
  4. 在刚创建目录里创建 main.go 文件
  5. 写入格式化后的代码
  6. 运行 go run main.go 并收集 stdout
  7. 删除创建的文件夹以及 main.go
  8. 返回 stdout

参考