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

參考

相關文章
相關標籤/搜索