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 World itjsz.com\")",
"fmt"); nil == err {
fmt.Print(string(re))
} else {
fmt.Print(err.Error())
}
}
輸出:
Hello World itjsz.com
這裡我們引入了 goeval
包,呼叫它的 Eval 函式,第一個引數是,結構體定義程式碼(由於程式碼中沒有有用自定義結構體,所有這裡傳空), 第二個字串是要執行的程式碼,第三及以後的字串是import的包。
- 按照傳入的字串構建整個執行程式碼的字串
- 格式化程式碼,主要是刪除未使用 包,所以
import
的包可以多,但不能少。 - 在
tmp
目錄下隨機建立一個目錄,並進入 - 在剛建立目錄裡建立
main.go
檔案 - 寫入格式化後的程式碼
- 執行
go run main.go
並收集stdout
- 刪除建立的資料夾以及
main.go
- 返回 stdout
參考
本作品採用《CC 協議》,轉載必須註明作者和本文連結