Golang 能 Eval 么

2021-06-06 00:00 PHP技术学习 赞


Go Eval 库

Golang 的 eval() 函数第三方实现。

图片
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 公众号: phpitjsz\")",
  "fmt"); nil == err {
  fmt.Print(string(re))
 } else {
  fmt.Print(err.Error())
 }
}

输出:

Hello 公众号: phpitjsz

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

实现细则

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

参考

  • https://golangtc.com/t/55b4ef18b09ecc22f6000219
本文章转载自公众号:phpitjsz

首页 - PHP 相关的更多文章: