將 Go 語言當成腳本來使用 - gomacro
gomacro 是一個近乎完整的 Go 解釋器,用純 Go 實現(xiàn),它同時提供交互式 REPL 和腳本模式,并且在運行時不需要 Go 工具鏈(除了一些非常特殊的場景:在運行時導入第三方包)。它在 Go 標準庫之外有兩個依賴項:github.com/peterh/liner 和 golang.org/x/tools/go/packages。

REPL 是 Read-Eval-Print Loop 的縮寫,是一種簡單的,交互式的編程環(huán)境,其中 REPL 分別指:
Read:獲得用戶輸入 Eval:對輸入求值 Print:打印、輸出求值的結果 Loop:循環(huán),可以不斷地重復 Read-Eval-Print
REPL 對于學習一門新的編程語言非常有幫助,你可以在這個交互環(huán)境里面通過輸出快速驗證你的理解是不是正確。比如我們最常使用的 Python 自帶了一個這樣的編程環(huán)境:
???~?python3
Python?3.8.9?(default,?Mar?30?2022,?13:51:16)
[Clang?13.1.6?(clang-1316.0.21.2.3)]?on?darwin
Type?"help",?"copyright",?"credits"?or?"license"?for?more?information.
>>>?a?=?1
>>>?a?+?2
3
>>>?print(a?-?2)
-1
>>>
功能
Gomacro 就是這樣一個針對 Go 語言的一個 REPL 工具,它可以被用來:
一個獨立的可執(zhí)行文件,具有交互式 Go REPL、行編輯和代碼補全功能:只需在命令行中運行gomacro,然后輸入 Go 代碼即可。$?gomacro
[greeting?message...]
gomacro>?import?"fmt"
gomacro>?fmt.Println("hello,?world!")
hello,?world!
14??????//?int???//?error
gomacro>只需要按下 TAB 鍵就可以自動提示,再按 TAB 鍵可以循環(huán)完成可能的內容。行編輯主要遵循 Emacs。 Ctrl+A或Home跳到行首,Ctrl+E或End跳到行尾,Ald+D刪除從光標開始的單詞......一個試驗的 Go 泛型工具 Go 源碼 debug 工具 一個交互式工具,如果你使用已編譯的 Go 與科學庫(物理學、生物信息學、統(tǒng)計學......),你可以從 gomacro REPL導入相同的庫(在 Linux 和 Mac OS X 上立即生效,在其他平臺上需要重新啟動),交互式地調用它們,檢查結果,將它們反饋給其他函數(shù)/庫,所有這些都在一個會話中完成。導入的庫將被編譯,而不是解釋,所以它們將和編譯后的 Go 一樣快。只需幾行代碼即可將 Eval()和腳本功能添加到你的 Go 程序中:?package?main
?import?(
?????"fmt"
?????"reflect"
?????"github.com/cosmos72/gomacro/fast"
?)
?func?RunGomacro(toeval?string)?reflect.Value?{
?????interp?:=?fast.New()
?????vals,?_?:=?interp.Eval(toeval)
?????//?for?simplicity,?only?use?the?first?returned?value
?????return?vals[0].ReflectValue()
?}
?func?main()?{
?????fmt.Println(RunGomacro("1+1"))
?}一種在沒有 Go 編譯器的情況下即時執(zhí)行 Go 源代碼的方法:你可以運行 gomacro FILENAME.go。或者你可以在 Go 源文件的開頭插入一行#!/usr/bin/env gomacro,然后使用chmod +x FILENAME.go將該文件標記為可執(zhí)行文件,最后使用./FILENAME.go即可執(zhí)行它(僅適用于在類 Unix 系統(tǒng)上:Linux、*BSD、Mac OS X ...)Go 代碼生成工具: gomacro最初是作為向 Go 添加類似 Lisp 的宏的實驗開始的,它們對于簡化代碼生成非常有用。宏是普通的 Go 函數(shù),其特殊之處僅在于一個方面:在編譯代碼之前執(zhí)行,其輸入輸出為代碼
安裝
需要 Go 1.13+ 版本,Gomacro 是純 Go,理論上它應該可以在 Go 編譯器支持的任何平臺上運行。以下組合經過測試并已知有效:
Linux: amd64,386, arm64, arm, mips, ppc64le Mac OS X: amd64,386 (386 binaries running on amd64 system) Windows: amd64,386 FreeBSD: amd64,386 Android: arm64, arm
執(zhí)行下面的命令即可安裝:
go?get?-u?github.com/cosmos72/gomacro
使用
如果你在 Linux 或 Mac OS X 上運行 gomacro,那么 import 就可以工作了:它會自動下載、編譯和導入一個包,如下所示:
$?gomacro
[greeting?message...]
gomacro>?import?(?"gonum.org/v1/floats";?"gonum.org/v1/plot"?)
//?debug:?running?"go?get?gonum.org/v1/gonum/floats?gonum.org/v1/plot"?...
go:?downloading?gonum.org/v1/plot?v0.11.0
[...?more?messages?from?go?toolchain?...]
//?debug:?running?"go?mod?tidy"?...
go:?downloading?github.com/go-fonts/latin-modern?v0.2.0
go:?downloading?rsc.io/pdf?v0.1.1
go:?downloading?github.com/go-fonts/dejavu?v0.1.0
//?debug:?compiling?plugin?"/home/max/go/src/gomacro.imports/gomacro_pid_187824/import_1"?...
gomacro>?plot.New()
&{...}?//?*gonum.org/v1/plot.Plot
注意:在內部,gomacro 將編譯和加載一個 Go 插件,其中包含 import ( ... ) 中列出的所有包的導出聲明。
命令 go mod tidy 在編譯插件之前會自動執(zhí)行,它會嘗試解決由于直接導入或間接導入同一包的不同版本而導致的任何版本沖突(即作為必需的依賴項)。
Go 插件目前僅在 Linux 和 Mac OS X 上受支持。
從 2.6 版開始,gomacro 還集成了調試器。輸入方式有以下三種:
在解釋代碼運行時按 CTRL+C在提示符下輸入 : debug STATEMENT-OR-FUNCTION-CALL在代碼中添加語句(表達式不夠) "break"或_ ="break",然后正常執(zhí)行
在所有情況下,執(zhí)行都將暫停,你將收到一個 debug> 提示符,該提示符接受以下命令:step、next、finish、continue、env [NAME]、inspect EXPR、list、print EXPR-OR-STATEMENT。
總體上的體驗就是一個支持基本功能的 REPL,支持 Tab 自動補全(例如輸入 fmt.Print 按 Tab 會在 fmt.Print、fmt.Printf 和 fmt.Println 之前切換)、調試和簡單的查看函數(shù)簽名。gomacro 對于基本的快速驗證代碼運行結果是夠的。
Git 倉庫:https://github.com/cosmos72/gomacro
