Go 語言程式碼風格規範-概述篇
每門開發語言都會有其特有的風格規範(亦或指南),開發者遵循規範能帶來顯著收益,有效促進團隊協作、減少 bug 錯誤、降低維護成本等。
Google 開源的 Google Style Guides ()為多種程式語言提供了風格規範,包括 C++、Java、Python、JavaScript 等。在 2022 年 11 月,Go 語言風格規範(go/index)也終於得到開源。
Google 釋出的 Go 語言風格規範一共包括四部分內容。
概述篇:go/index
指南篇:go/guide
決策篇:go/decisions
最佳實踐篇:go/best-practices
如果你所在的團體還未形成一套系統的 Go 風格規範,不妨參考這份指南。
關於
Go 語言風格規範和附錄文件整理了當前編寫易讀且正宗的 Go 的最佳方法。遵循程式設計指南不是絕對的,因為這些文件不可能面面俱到。我們的目的是儘可能減少編寫可讀性 Go 程式碼試錯成本,新手們可以避免常見錯誤。這份規範還為那些在 Google 內部 Go 程式碼審查的人提供統一的風格指導。
文件 | 連結 | 主要受眾 | 規範的 | 權威的 |
---|---|---|---|---|
指南 | go/guide | 所有人 | 是 | 是 |
決策 | go/decisions | 程式碼可讀性審查者 | 是 | 否 |
最佳實踐 | go/best-practices | 任何感興趣的人 | 否 | 否 |
文件
1.【指南篇】概述了 Google Go 程式碼風格的基礎。該文件是權威的,並用作【決策篇】和【最佳實踐篇】中建議的依據。
2.【決策篇】是一個更詳細的文件,它總結了關於特定風格點的決策,並適當地討論了這些決策背後的原因。
這些決策可能會因為新資料型別、新語言特性、新標準庫或新的模型而改變,但我們並不需要 Google 的 Go 程式設計師與該文件實時一致。
3.【最佳實踐篇】記錄了一些隨著時間的推移而演變的模式,這些模式解決了常見問題,易於閱讀,高魯棒性也滿足了程式碼可維護性要求。
這些最佳實踐並不權威,但我們鼓勵 Google 的 Go 程式設計師儘可能使用它們,以保持程式碼庫的統一。
這些文件的目的:
就權衡可替代編碼風格的一套原則達成一致。
編纂 Go 編碼風格已解決的問題。
記錄並提供正宗 Go 程式碼的規範示例。
記錄各種編碼風格決策的利弊。
幫助減少 Go 可讀性程式碼審查中的意外。
幫助程式碼可讀性程式碼審查者使用一致的術語和指南。
非這些文件的目的:
成為程式碼可讀性審查者在程式碼評論下的詳盡清單。
列出所有規則,並希望每個人都記住並始終遵守。
失去對語言特性和風格使用的良好判斷。
為消除程式碼風格差異而成為大規模修改的藉口。
各 Go 程式設計師之間,以及各團隊的程式碼庫之間總會存在差異。然而,為了符合 Google 和 Alphabet 的最大利益,我們的程式碼庫儘可能得保持一致,因此,請自由地對你認為合適的編碼風格進行改進,發現不符合風格規範的行為時,你也不需要過於吹毛求疵。特別是,這些文件可能會隨著時間而改變,它不應該是導致現有程式碼庫需要額外改動的理由;使用最新的最佳實踐去編寫新程式碼就足夠了,隨著時間的推移這部分內容就已經被解決了。
重要的是要認識到程式碼風格問題本質上是個人的,並且總是存在固有的權衡。這些文件中的大部分指導都是主觀的,但就像gofmt
一樣,它們提供的統一性具有重要價值。因此,這些編碼風格建議不會在未經適當討論的情況下修改。我們鼓勵 Google 的 Go 程式設計師遵循這些程式設計風格規範,即使他們可能對某些內容並不同意。
定義
整個程式碼風格系列文件中使用的一些詞語,定義如下
Canonical(權威的):建立規範且持久的規則。
在這些文件中,“權威的”用於描述被認為是所有程式碼(舊的和新的)都應該遵循的標準,並且語句不會隨著時間的推移而發生重大變化。權威的文件中的原則應該被程式碼作者和審查人理解,權威的文件中包含的所有內容都必須達到高標準。因此,與非權威的文件相比,權威的文件通常更短,並且規定的程式碼風格元素也更少。
go#canonical
Normative(規範的):旨在建立一致性。
在這些文件中,“規範的”用於描述 Go 程式碼審查者都同意的程式碼風格元素,以確保他們在提供建議、術語和理由時能保持一致。這些風格元素可能會隨著時間的推移而發生變化,這些文件將反映這些變化,以便程式碼審查者可以保持一致與最新。Go 程式碼開發者不用熟悉這些規範性文件,但這些文件應該被程式碼審查者用作可讀性審查的參考。
go#normative
Idiomatic(正宗的):常見且熟悉的。
在這些文件中,“正宗的”用於指代 Go 程式碼中普遍存在的東西,並已成為一種易於識別的熟悉模式。一般而言,如果兩種模式在上下文中起到相同的目的,那麼正宗的模式應該優先於非正宗的模式,因為這是程式碼讀者最熟悉的模式。
go#idiomatic
附加參考
本指南假定讀者熟悉 Effective Go(https://go.dev/doc/effective_go),因為它為整個 Go 社群的 Go 程式碼提供了一個共同的基線。
下面是一些額外的資源,供那些希望自學 Go 程式碼風格的人,和為程式碼審查者提供更多能使用的評論意見依據連結。我們並不期望 Go 程式碼可讀性的參與者熟悉這些資源,但他們可能會作為程式碼可讀性審查的背景出現。
外部參考
[Go 語言規範] https://go.dev/ref/spec [Go 高頻問題問答] https://go.dev/doc/faq [Go記憶體模型] https://go.dev/ref/mem [Go資料結構] [Go介面] [Go諺語] Go 小技巧 - 敬請關注.
相關的“廁所測試“文件
[TotT: Identifier Naming] https://testing.googleblog.com/2017/10/code-health-identifiernamingpostforworl.html [TotT: Testing State vs. Testing Interactions] https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html [TotT: Effective Testing] https://testing.googleblog.com/2014/05/testing-on-toilet-effective-testing.html [TotT: Risk-driven Testing] https://testing.googleblog.com/2014/05/testing-on-toilet-risk-driven-testing.html [TotT: Change-detector Tests Considered Harmful] https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html
額外的外部著作
[Go教條]
[少即是多] https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html
[埃斯梅拉達的想象力] https://commandcenter.blogspot.com/2011/12/esmereldas-imagination.html
[用於解析的正規表示式] https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html
[Gofmt 的風格沒有人喜歡,但 Gofmt 卻是每個人的最愛] (YouTube)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2929462/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go 語言程式碼風格規範-指南篇Go
- Uber Go 語言編碼規範Go
- Go 語言程式設計規範Go程式設計
- 前端程式碼規範 — JavaScript 風格指南前端JavaScript
- C 語言程式碼風格之 Linux 核心程式碼風格Linux
- PHP編碼風格規範PHP
- 求求你規範下你的程式碼風格
- 統一規範化程式碼的命名風格
- 如何使用Go語言寫出物件導向風格的程式碼Go物件
- Vue專案使用eslint + prettier規範程式碼風格VueEsLint
- 擴充套件01:程式碼風格/python規範style套件Python
- Java語言編碼規範Java
- 談談編碼風格與規範
- 3.Go語言中常量,變數, 及其命名規則以及程式碼風格Go變數
- Java語言規範Java
- 嵌入式c語言編碼規範C語言
- Java語言編碼規範(Java Code Conventions)Java
- 優步公司的Go語言編寫風格指南Go
- 5.Go變數 常量 變數命名規則 程式碼風格Go變數
- go語言編譯過程概述Go編譯
- PHP 規範 - Symfony 程式碼規範PHP
- C語言程式設計,初學者必學程式碼規範,你知道哪些?C語言程式設計
- java程式設計規約----程式碼風格(一)Java程式設計
- Java語言編碼規範(Java Code Conventions)【引用】blogjavaJava
- C語言程式設計規範——名稱縮寫C語言程式設計
- Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- Go 語言專案程式碼品質Go
- Go 語言如何解決程式碼耦合Go
- 體驗go語言的風騷式程式設計Go程式設計
- 程式碼規範之前端編寫碼規範前端
- [譯] Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- Less程式碼規範
- css程式碼規範CSS
- 程式碼分支規範
- iOS程式碼規範iOS
- 程式碼規範整理
- JS程式碼規範JS
- 統一規範化專案的命名風格