返回 網站動態
DevTool 團隊

Go 線上執行怎麼用:試語法、跑片段與本機工具鏈的分工

學 Go 的第一週,裝環境往往比學語法更磨人。這篇按需求分流:試一行語法、跑教材例子、驗證標準庫行為,瀏覽器裡的 Go 線上執行就夠;寫正式專案,老實上本機工具鏈。講清線上跑 Go 的三種姿勢——單檔案速跑、多檔案工作區(可傳 ZIP)、互動式主控台輸入(bufio.Scanner 直接讀),goroutine/channel 並發原語的體驗方式,預載標準庫與第三方套件清單;最後是真話:瀏覽器裡跑的是解譯器不是完整工具鏈,編譯期診斷弱於 go build,編輯器是輕量的不是 IDE。

先分流:你要拿它幹什麼

學 Go 的第一週,配 GOPATH、選編輯器、裝工具鏈往往比學語法更磨人。按需求分流(競品格局為 2026-10-24 競研核實):

你要做的事 順手的選擇 為什麼
「這行語法對不對」的三十秒問題 官方 go.dev/play 或任何線上 playground 單檔案貼程式碼點 Run,零心智負擔
跑教材例子(猜數字、讀輸入的迴圈) 帶互動主控台的線上執行器(如本站 Go 線上編譯器) 例子裡 fmt.Scan 要讀鍵盤,多數 playground 沒有互動輸入跑不通
多檔案小程式、實驗工程結構 支援多檔案工作區的線上執行器 一個 main 拆多個原始檔,配合檔案樹整體執行
寫進倉庫的正式專案 本機工具鏈(go build / go vet / IDE) 工程品要完整的編譯期診斷,瀏覽器解譯器給不了

前三行是本文的範圍:瀏覽器裡的 Go 線上執行,怎麼用才順手。

線上跑 Go 的三種姿勢

以本站 Go 線上編譯器 為例(WASM 解譯執行,程式碼不上傳):

單檔案速跑:貼程式碼點執行,標準庫開箱即用——fmt、strings、strconv、sort、time、encoding/json、errors 直接 import。fmt.Println("hello") 到 channelselect 的例子都能跑。死循環不用怕,一鍵停止立即回到可執行狀態。

多檔案工作區:同一個 main 包拆成多個原始檔,檔案樹裡增刪檔案、上傳本機檔案或匯入整個 ZIP,整體執行。適合驗證「這樣拆包結構對不對」——把教學專案拖進來跑一遍,比看目錄截圖直觀得多。

互動式主控台:這是選線上執行器時最值得檢查的能力——bufio.Scanner(os.Stdin)、fmt.Scan 這類標準輸入寫法直接可用,逐行輸入、程式逐行讀。Go 教材前幾章的例子大量依賴鍵盤輸入(猜數字遊戲、循環讀入直到 EOF),沒有互動輸入的 playground 只能把例子改寫成寫死資料,學習體驗打折。

語法試驗的高頻場景

並發原語體驗:goroutine、channel、select 都能在瀏覽器裡直接跑——教科書上「生產者消費者」的十行例子,改個 buffer 大小、換個 select 分支立刻看到行為差異。並發是 Go 的核心賣點,動手改參數比讀三遍文件有效。

標準庫行為驗證:「time.After 在 select 裡的行為」「strconv.Quote 到底轉義什麼」「sort.Slice 是不是穩定排序」——這類「文件讀了兩遍還是不確定」的問題,十行程式碼線上驗證是最快的閉環。

預載第三方套件:uuid、yaml.v3、errgroup、decimal 這類小而高頻的庫 import 即用,不用裝。寫真實專案前的「這個庫的 API 順不順手」,可以先在瀏覽器裡試十分鐘。

執行歷史:試驗品多了以後,本機儲存的執行歷史可以隨時恢復、重跑、對比——「剛才那個版本的行為」不用靠記憶。

真話:解譯器不是工具鏈

瀏覽器方案跑的是 WASM 解譯器(本站用 yaegi),不是完整的 Go 工具鏈。差距要講清楚:

  • 編譯期診斷弱:go build、go vet 在編譯階段抓住的型別錯誤、未使用匯入、可疑寫法,解譯器要執行到那一步才暴露,錯誤形態也不同。片段試驗無所謂,工程程式碼不能靠它把關;
  • 編輯器是輕量的:線上編輯器提供高亮與基本編輯,不是 gopls 驅動的 IDE——沒有跳轉定義、沒有即時診斷面板。這是「片段試驗場」的定位使然,不是缺陷,但要知道;
  • 依賴生態有限:標準庫加預載套件覆蓋教學與片段場景,任意公網套件(go get)在瀏覽器裡做不到。

判斷標準一句話:程式碼是試驗品就線上跑,是工程品就上本機。中間態(幾十行、要進倉庫前先驗證一下)兩邊都行——線上驗證行為,本機過編譯。

常見問題

Go 線上執行和本機裝 Go 差距有多大?

瀏覽器方案跑的是 WASM 解譯器(如 yaegi),不是完整工具鏈:適合語法試驗、教學例子、標準庫行為驗證;差距在編譯期診斷——go build、go vet 能在編譯階段抓住的型別與匯入問題,解譯器要執行到那一步才暴露,錯誤訊息的形態也不同。判斷標準:程式碼是「試驗品」用線上,是要進倉庫的「工程品」用本機工具鏈。

瀏覽器裡能讀鍵盤輸入嗎?

看工具:多數線上 playground 沒有互動式輸入,程式裡的 Scan/Scanner 讀不到東西,例子只能寫死資料。帶互動主控台的線上執行器支援逐行輸入——bufio.Scanner(os.Stdin)、fmt.Scan 這類標準寫法直接可用,教材裡依賴輸入的例子原樣跑通,不用改程式碼。

線上環境能 import 哪些套件?

標準庫通常可用(fmt、strings、strconv、sort、time、encoding/json、errors 這些高頻庫開箱即用);第三方套件取決於工具是否預載——常見的是 uuid、yaml.v3、errgroup、decimal 這類小而高頻的庫。任意公網套件(go get)在瀏覽器環境裡做不到:WASM 沒有模組代理與網路檔案系統。需要大生態依賴的時候,就是切本機工具鏈的訊號。

和官方 go.dev/play 相比怎麼選?

官方 playground 的定位是單檔案速驗:貼一段程式碼點 Run,適合「這行語法對不對」的三十秒問題。它的邊界同樣明確——沒有互動式輸入、單檔案為主、程式碼要提交到伺服器執行。帶互動主控台、多檔案工作區、本機執行的線上執行器適合更重的場景:教材例子的輸入依賴、多檔案小程式、不想把程式碼發出去的內部片段。兩個不是二選一,是按片段重量分層用。