有了它,Golang 也能 Eval 了

小白要生髮發表於2021-06-05

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"
    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的包。

  1. 按照傳入的字串構建整個執行程式碼的字串
  2. 格式化程式碼,主要是刪除未使用 包,所以 import 的包可以多,但不能少。
  3. tmp 目錄下隨機建立一個目錄,並進入
  4. 在剛建立目錄裡建立 main.go 檔案
  5. 寫入格式化後的程式碼
  6. 執行 go run main.go 並收集 stdout
  7. 刪除建立的資料夾以及 main.go
  8. 返回 stdout

參考

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章