曾幾何時,語言的在線運行(Playground)似乎成了標配。確實,Playground 能夠讓我們可以快速試驗一些想法。Go 語言在發(fā)布之初就提供了一個,這就是 https://play.golang.org。然而,由于眾所周知的原因,我們訪問不了。為了方便國內(nèi)廣大 gopher,我搞了一個國內(nèi)鏡像:https://play.studygolang.com,盡情使用、分享吧。
官方的 Playground

不得不說,Go 官方的 Playground 真的比較原始。提供的功能比較少,主要有:
- 格式化,但需要手動點擊。在點擊格式化時,如果勾選了 Imports,會自動對使用的標準庫做導入;
- 分享。能夠?qū)⒛愕拇a分享給其他人,方便對方查看、運行;
- 代碼片段。頂部下拉列表中提供了一些代碼片段,點擊可以直接切換編輯框內(nèi)容;
總結下:官方的 Playground 主要提供了在線編輯、運行、分享 Go 代碼的功能,其中分享對全球的 gopher 來說,可以更方便的進行代碼交流,排查問題等,分享也是使用最多的。
然而官方的 Playground 缺點也很明顯:
- 界面簡單,略顯丑陋;
- 不支持代碼高亮;
- 不支持代碼提示;
- 語法錯誤無法實時提示;
- 。。。
于是有了第三方的 Playground。
goplay.space
第一個出場的是 https://goplay.space。這是 iafan 在 2017 年開發(fā)的,
Go Play Space is an experimental alternative Go Playground[1] frontend that is built in Go itself (usingGopherJS[2]), a Go→JAVAScript transpiler, and Vecty[3], a React-like frontend library for GopherJS).

可見,goplay.space 的代碼運行依然使用官方的,只是替換了前端部分。看看它提供了哪些功能:
- 語法高亮顯示,大括號和引號自動關閉,正確的撤消/重做,自動縮進;
- 智能文檔查找:例如雙擊源代碼中的包名或 Println 等函數(shù)名稱,在右邊將看到相關的文檔;這個功能真的很實用;
- 實時的語法錯誤檢查;
- 錯誤行高亮顯示(語法錯誤和編譯器返回的錯誤);
- 能夠突出顯示代碼行和代碼塊(類似在 Github 上,但更好!)—只需單擊行號即可。使用 Shift 和 Ctrl 修改選擇;
- 鍵盤快捷鍵(請參閱頂部按鈕標題處);
- 支持多個 UI 主題;
- 支持 Fira Code[4] 字體(系統(tǒng)中已安裝的字體或 Webfont);
- go import 始終在運行代碼之前運行,因此您通常不必擔心導入問題;
代碼執(zhí)行是官方的 Go Playground 的代理,因此它保證了程序?qū)⒂邢嗤慕Y果。同時共享的代碼段也存儲在 golang.org 服務器上。所以,分享的代碼,可以直接在 goplay.space 展示。比如這個代碼:https://play.golang.org/p/aouL6zP4O35,對應的 goplay.space 就是:https://goplay.space/#aouL6zP4O35。
個人認為 goplay.space 最大的特色是智能文檔查找,可以在寫代碼時及時查看文檔。要是加上自動完成功能就好了。
goplay.tools
x1unix[5] 覺得以上兩個 Playground 都不夠好。就在前些天(2020-08-12),發(fā)布了一個 “Better Go Playground”,這就是 https://goplay.tools/。
幾個月前,x1unix 決定嘗試創(chuàng)建一個更好的 Go Play 版本,該版本將具有一些有價值的小功能,使原型制作足夠舒適,例如基本代碼自動完成(僅支持 stdlib),語法檢查,代碼段和示例。另外,隨著 Go in WebAssembly 趨勢開始增長,添加了 WebAssembly 支持。
此外,用戶可以選擇編輯器字體以及一些其他選項的小選項來自定義編輯器。
這個項目基于 React 和 Monaco editor 創(chuàng)建。

目前該 Playground 有如下特性:
- 代碼完成:標準庫
- 加載和保存文件
- 代碼片段和教程,基于 gobyexample.com[6]
- WebAssembly 支持
- 暗黑模式
- 更多定制選項
和 goplay.space 一樣,它也是官方 Playground 的代理,因此官方分享的,在這里也可以直接查看,方便國內(nèi)用戶。上面例子對應該 Playground 是:https://goplay.tools/snippet/aouL6zP4O35。
仔細研究會發(fā)現(xiàn)它還支持鼠標右鍵菜單,有類似 VSCode 的 Command Palette 功能,調(diào)出該面板的快捷鍵是 F1。

代碼完成功能可以顯示對應的文檔(針對標準庫),如下:

可見這真的是一個更好的 Playground,一定程度上有點在線編輯器的感覺。該項目在 GitHub 的地址:https://github.com/x1unix/go-playground。
后記
除了以上三款,其實還有一些其他的,比較小眾,因此不做對比。最后,推薦大家以后可以使用 https://goplay.tools/,有興趣的也可以為它貢獻代碼。
參考資料
[1]
Go Playground: https://play.golang.org/
[2]
GopherJS: https://github.com/gopherjs/gopherjs
[3]
Vecty: https://github.com/gopherjs/vecty
[4]
Fira Code: https://github.com/tonsky/FiraCode
[5]
x1unix: https://twitter.com/x1unix
[6]
gobyexample.com: https://gobyexample.com/
覺得不錯,歡迎關注!