曾幾何時(shí),語言的在線運(yùn)行(Playground)似乎成了標(biāo)配。確實(shí),Playground 能夠讓我們可以快速試驗(yàn)一些想法。Go 語言在發(fā)布之初就提供了一個(gè),這就是 https://play.golang.org。然而,由于眾所周知的原因,我們?cè)L問不了。為了方便國內(nèi)廣大 gopher,我搞了一個(gè)國內(nèi)鏡像:https://play.studygolang.com,盡情使用、分享吧。
官方的 Playground
不得不說,Go 官方的 Playground 真的比較原始。提供的功能比較少,主要有:
- 格式化,但需要手動(dòng)點(diǎn)擊。在點(diǎn)擊格式化時(shí),如果勾選了 Imports,會(huì)自動(dòng)對(duì)使用的標(biāo)準(zhǔn)庫做導(dǎo)入;
- 分享。能夠?qū)⒛愕拇a分享給其他人,方便對(duì)方查看、運(yùn)行;
- 代碼片段。頂部下拉列表中提供了一些代碼片段,點(diǎn)擊可以直接切換編輯框內(nèi)容;
總結(jié)下:官方的 Playground 主要提供了在線編輯、運(yùn)行、分享 Go 代碼的功能,其中分享對(duì)全球的 gopher 來說,可以更方便的進(jìn)行代碼交流,排查問題等,分享也是使用最多的。
然而官方的 Playground 缺點(diǎn)也很明顯:
- 界面簡單,略顯丑陋;
- 不支持代碼高亮;
- 不支持代碼提示;
- 語法錯(cuò)誤無法實(shí)時(shí)提示;
- 。。。
于是有了第三方的 Playground。
goplay.space
第一個(gè)出場的是 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 的代碼運(yùn)行依然使用官方的,只是替換了前端部分。看看它提供了哪些功能:
- 語法高亮顯示,大括號(hào)和引號(hào)自動(dòng)關(guān)閉,正確的撤消/重做,自動(dòng)縮進(jìn);
- 智能文檔查找:例如雙擊源代碼中的包名或 Println 等函數(shù)名稱,在右邊將看到相關(guān)的文檔;這個(gè)功能真的很實(shí)用;
- 實(shí)時(shí)的語法錯(cuò)誤檢查;
- 錯(cuò)誤行高亮顯示(語法錯(cuò)誤和編譯器返回的錯(cuò)誤);
- 能夠突出顯示代碼行和代碼塊(類似在 Github 上,但更好!)—只需單擊行號(hào)即可。使用 Shift 和 Ctrl 修改選擇;
- 鍵盤快捷鍵(請(qǐng)參閱頂部按鈕標(biāo)題處);
- 支持多個(gè) UI 主題;
- 支持 Fira Code[4] 字體(系統(tǒng)中已安裝的字體或 Webfont);
- go import 始終在運(yùn)行代碼之前運(yùn)行,因此您通常不必?fù)?dān)心導(dǎo)入問題;
代碼執(zhí)行是官方的 Go Playground 的代理,因此它保證了程序?qū)⒂邢嗤慕Y(jié)果。同時(shí)共享的代碼段也存儲(chǔ)在 golang.org 服務(wù)器上。所以,分享的代碼,可以直接在 goplay.space 展示。比如這個(gè)代碼:https://play.golang.org/p/aouL6zP4O35,對(duì)應(yīng)的 goplay.space 就是:https://goplay.space/#aouL6zP4O35。
個(gè)人認(rèn)為 goplay.space 最大的特色是智能文檔查找,可以在寫代碼時(shí)及時(shí)查看文檔。要是加上自動(dòng)完成功能就好了。
goplay.tools
x1unix[5] 覺得以上兩個(gè) Playground 都不夠好。就在前些天(2020-08-12),發(fā)布了一個(gè) “Better Go Playground”,這就是 https://goplay.tools/。
幾個(gè)月前,x1unix 決定嘗試創(chuàng)建一個(gè)更好的 Go Play 版本,該版本將具有一些有價(jià)值的小功能,使原型制作足夠舒適,例如基本代碼自動(dòng)完成(僅支持 stdlib),語法檢查,代碼段和示例。另外,隨著 Go in WebAssembly 趨勢開始增長,添加了 WebAssembly 支持。
此外,用戶可以選擇編輯器字體以及一些其他選項(xiàng)的小選項(xiàng)來自定義編輯器。
這個(gè)項(xiàng)目基于 React 和 Monaco editor 創(chuàng)建。
目前該 Playground 有如下特性:
- 代碼完成:標(biāo)準(zhǔn)庫
- 加載和保存文件
- 代碼片段和教程,基于 gobyexample.com[6]
- WebAssembly 支持
- 暗黑模式
- 更多定制選項(xiàng)
和 goplay.space 一樣,它也是官方 Playground 的代理,因此官方分享的,在這里也可以直接查看,方便國內(nèi)用戶。上面例子對(duì)應(yīng)該 Playground 是:https://goplay.tools/snippet/aouL6zP4O35。
仔細(xì)研究會(huì)發(fā)現(xiàn)它還支持鼠標(biāo)右鍵菜單,有類似 VSCode 的 Command Palette 功能,調(diào)出該面板的快捷鍵是 F1。
代碼完成功能可以顯示對(duì)應(yīng)的文檔(針對(duì)標(biāo)準(zhǔn)庫),如下:
可見這真的是一個(gè)更好的 Playground,一定程度上有點(diǎn)在線編輯器的感覺。該項(xiàng)目在 GitHub 的地址:https://github.com/x1unix/go-playground。
后記
除了以上三款,其實(shí)還有一些其他的,比較小眾,因此不做對(duì)比。最后,推薦大家以后可以使用 https://goplay.tools/,有興趣的也可以為它貢獻(xiàn)代碼。
參考資料
[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/
覺得不錯(cuò),歡迎關(guān)注!






