Go 部落格
go fmt 你的程式碼
引言
Gofmt 是一個自動格式化 Go 原始碼的工具。
Gofmt 格式化的程式碼
-
更容易 編寫:在忙於編碼時,永遠不用擔心微小的格式問題;
-
更容易 閱讀:當所有程式碼看起來都一樣時,您無需在腦海中將他人的格式風格轉換為自己能理解的樣式。
-
更容易 維護:對原始碼的機械更改不會導致檔案格式發生不相關的更改;diff 只顯示實際的更改。
-
無爭議:再也不用爭論空格或花括號的位置了!
格式化你的程式碼
我們最近對 Go 的開源包進行了一項調查,發現約 70% 的包都遵循 gofmt 的規則。這比我們預期的要多——感謝所有使用 gofmt 的人——但我們仍然希望縮小差距。
要格式化你的程式碼,你可以直接使用 gofmt 工具
gofmt -w yourcode.go
或者你可以使用“go fmt”命令
go fmt path/to/your/package
為了幫助您的程式碼保持標準風格,Go 倉庫中包含編輯器和版本控制系統的鉤子,可以輕鬆地在您的程式碼上執行 gofmt。
對於 Vim 使用者,Vim for Go 外掛 包含一個 :Fmt 命令,可以在當前緩衝區上執行 gofmt。
對於 Emacs 使用者,go-mode.el 提供了一個 gofmt-before-save 鉤子,可以透過在您的 .emacs 檔案中新增以下行來安裝:
(add-hook 'before-save-hook #'gofmt-before-save)
對於 Eclipse 或 Sublime Text 使用者,GoClipse 和 GoSublime 專案為這些編輯器添加了 gofmt 功能。
對於 Git 愛好者,misc/git/pre-commit 指令碼 是一個 pre-commit 鉤子,可以防止提交格式不正確的 Go 程式碼。如果您使用 Mercurial,hgstyle 外掛 提供了一個 gofmt pre-commit 鉤子。
機械原始碼轉換
機器格式化程式碼最大的優點之一是它可以進行機械轉換,而不會在 diff 中產生不相關的格式噪音。當處理大型程式碼庫時,機械轉換是無價的,因為它比手動進行大範圍的更改更全面、更不容易出錯。事實上,在規模化工作(如我們在 Google 所做的)時,手動進行這類更改通常是不切實際的。
機械操作 Go 程式碼的最簡單方法是使用 gofmt 的 -r 標誌。該標誌指定一個重寫規則,形式為:
pattern -> replacement
其中 pattern 和 replacement 都是有效的 Go 表示式。在 pattern 中,單字元的小寫識別符號用作萬用字元,匹配任意子表示式,這些子表示式在 replacement 中被替換為相同的識別符號。
例如,Go 核心的近期更改將一些 `bytes.Compare` 的用法重寫為使用更高效的 bytes.Equal。貢獻者僅透過兩次 gofmt 呼叫就完成了更改。
gofmt -r 'bytes.Compare(a, b) == 0 -> bytes.Equal(a, b)'
gofmt -r 'bytes.Compare(a, b) != 0 -> !bytes.Equal(a, b)'
Gofmt 還啟用了 gofix,它可以進行任意複雜的原始碼轉換。在早期我們經常對語言和庫進行破壞性更改時,gofix 是一個非常有價值的工具。例如,在 Go 1 之前,內建的 error 介面不存在,約定是使用 os.Error 型別。當我們引入 error 時,我們提供了一個 gofix 模組,將所有對 os.Error 及其相關幫助函式的引用重寫為使用 error 和新的 errors 包。手動嘗試此操作將是艱鉅的,但有了標準格式化的程式碼,準備、執行和審查這次更改就相對容易了,這次更改幾乎觸及了現有的所有 Go 程式碼。
有關 gofix 的更多資訊,請參閱本文。
下一篇文章:Go Map 的使用
上一篇文章:併發不是並行
部落格索引