Go 部落格

go fmt 編碼

Andrew Gerrand
2013 年 1 月 23 日

簡介

Gofmt 是一個自動格式化 Go 原始碼的工具。

經過 Gofmt 格式化的編碼可以

  • 輕鬆撰寫:編寫過程中無須擔心細微的格式化問題,

  • 輕鬆閱讀:當所有編碼格式一致時,無須在腦中將其他人的編碼格式轉換為自己理解的格式。

  • 輕鬆維護:對原始碼進行機械修改不會影響檔案格式化中不相關的部分;差異只會顯示真實的修改。

  • 無爭議性:永遠無須再爭論縮排或大括號位置的問題!

格式化您的程式碼

我們最近針對現有的 Go 套件進行一項調查,發現其中約 70% 符合 gofmt 的規則。這超乎我們的預期,也要感謝所有使用 gofmt 的人,不過我們希望能繼續拉近差距。

若要將你的程式碼格式化,你可以直接使用 gofmt 工具

gofmt -w yourcode.go

或者你可以使用「go fmt」指令

go fmt path/to/your/package

為了使你的程式碼保持典型風格,Go 儲存庫包含掛勾,可用於編輯器和版本控制系統,以便於對你的程式碼執行 gofmt。

對於 Vim 使用者,Vim 的 Go 外掛包括針對目前緩衝區執行 gofmt 的命令 :Fmt。

對於 Emacs 使用者,go-mode.el提供 gofmt-before-save 掛勾,並可透過將此行加入至你的 .emacs 檔案來安裝

(add-hook 'before-save-hook #'gofmt-before-save)

對於 Eclipse 或 Sublime Text 使用者,GoClipseGoSublime 專案會為這些編輯器增加 gofmt 設施。

對於 Git 愛好者,misc/git/pre-commit 腳本為 pre-commit 掛勾,用於避免將格式設定錯誤的 Go 程式碼提交。如果你使用 Mercurial,hgstyle 外掛 提供 gofmt pre-commit 掛勾。

機器原始碼轉換

機器格式化程式碼最大的優點之一是,它能在不產生不相關的格式化雜訊的情況下進行機械轉換,而 diff 中則不會有這種雜訊。在使用大型程式碼庫時,機器轉換會非常有價值,因為它比手動進行範圍廣泛的變更更全面且更不容易出錯。實際上,在規模性的工作上(就像我們在 Google 所做的那樣),手動進行這些類型的變更通常是不切實際的。

使用 gofmt 的 -r 旗標是最簡單的機械操作 Go 程式碼方式。此旗標指定下列形式的重寫規則

pattern -> replacement

其中 pattern 和 replacement 都是有效的 Go 表達式。在樣式中,單一字元的變數識別碼作為萬用字元,用於配對任意的子表達式,而這些表達式會在 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,可進行隨意複雜的來源轉換。Gofmt 在我們定期對語言和函式庫進行重大變更的早期是極其重要的工具。例如,在 Go 1 之前,內建錯誤介面不存在,而慣例是使用 os.Error 類型。當我們 引入「error」 時,我們提供了一個 gofix 模組,可將對 os.Error 及其關聯輔助函式的所有參照改寫為使用 error 以及新的 errors 套件。若手動嘗試,將讓人望而生畏,但有了標準格式的程式碼,即可相對輕鬆準備、執行和檢閱此變更,它會影響現有的所有 Go 程式碼。

有關 gofix 的更多資訊,請參閱 這篇文章

下一篇文章:使用 Go 地圖
上一篇文章:並行處理不屬於平行處理
部落格索引