Go也能Eval了

Go Eval 库

Golangeval() 函数第三方实现。javascript

背景

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

如何在 golang 中使用 eval() 函数,phpjavascript 自带该功能。golang 官方是没有提供相关库的。java

在丰富的Go第三方生态中,着实没找到相关的库。却是看到有人作了一个demo 挂到博客。我就来拿来改改,作成了一个库,望广大 gopher 用的满意。git

安装

$ go get github.com/PaulXu-cn/goeval

功能介绍

这个 goeval 库,传入 golang 代码字符串,而后执行 eval() 函数,就能得到该 字符串代码 输出到 stdout 上的内容。github

使用例子:golang

package main

import (
    "fmt"
    eval "github.com/PaulXu-cn/goeval"
)

func main() {
 if re, err := eval.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的包。code

实现细则

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

参考