網站首頁 編程語言 正文
前言
今天這篇文章是站在巨人的肩膀上,匯總了目前主流的開發規范,同時結合Go語言的特點,以及自己的項目經驗總結出來的:爆肝分享兩千字Go編程規范。
后續還會更新更多優雅的規范。
命名風格
1.?【強制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。?
反?例?:?
_name / __name / $name / name_ / name$ / name__ ?
2.?【強制】代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。?
說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。
注意,純拼音命名方式更要避免采用。?
正例:
renminbi / alibaba / taobao / youku / hangzhou
等國際通用的名稱,可視同英文。
反 例 :
DaZhePromotion [ 打 折 ] / getPingfenByName() [評分] / int某變量 = 3
3.?【強制】公用的變量、類型、接口、結構、函數以及結構體的成員變量等命名使用UpperCamelCase
風格。
正例:
GolangStruct / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:
Golangstruct / UserDo / XMLService / TCPUDPDeal / TAPromotion
4.?【強制】私有的變量、類型、接口、結構、函數?以?及?參?數?名?、?局?部?變?量?都?統?一?使?用?lowerCamelCase 風格,必須遵從駝峰形式。
正 例 :
localValue / getHttpMessage() / inputUserId
5.?【強制】常量命名命名使用?UpperCamelCase 風格,并使用 const 聲明,力求語義表達完整 清楚,不要嫌名長。
正例:
const StatusOK = 200
6.?抽象結構命名使用?Abstract 或 Base 開頭; 異常類命名使用 Err 結尾; 測試類命名以 Test 開頭,以它要測試的函數的 名稱結尾。
正 例 :
?ParamsErr := errors.New(“params err”)
7.?接口命名規范一般使用?er 結尾:單個函數的接口名以“er”作為后綴,接口的實現則去掉 er; 兩個函數的接口名綜合兩個函數名,以 er 作為 后綴,接口的實現則去掉 er ; 三個以上函數的接口,抽象這個接口的功能,類似于結構體命名。
8.?【強制】數據和切片類型命名以?Arr 結尾,map 類型以 Map 結尾。相同功用的結構體可以根據功能采 用相同的結尾, Api 請求以 Req 結尾, 相應以 Res 結尾,數據結構體以 xxxModel 結尾, xxx 即為數據表名。
正例:
var userArr [3]string / type LoginReq struct{} / type UserDO struct{}
9.?【強制】返回結果主要為布爾類型的函數,函數名可以?is、has
等開頭
10.?【強制】工程名統一使用小寫,單詞之間使 用 - 分割。包目錄名一律使用小寫,盡量采用一 個單詞命名,單詞間不用符號分割,統一使用單 數形式,但是結構體名如果有復數含義,結構體 名可以使用復數形式。包目錄下的包名( package namepackage ),如非 main 函數,和包目錄名保持一直且單詞間用 _ 分隔,測試文件以 _test 結 尾。
正 例 :
?db-utils / package db_utils / package db_utils_test
反例:
services
11.?為了達到代碼自解釋的目標,任何自定義編程元?素在命名時,使用盡量完整的單詞組合來表達其意。反例:var a int 的隨意命名方式。
12.?在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。如規范【8】所示。
正例:
startTime / startDate
反例:
startedAt / startDt
13.如果模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。
說明:將設計模式體現在名字中,有利于閱讀者 快速理解架構設計理念。
代碼格式
1.?【強制】如果是大括號內為空,則簡潔地寫成{} 即可,大括號中間無需換行和空格;如果是非空 代碼塊則: 1) 左大括號前不換行。 2) 左大括號后換行。 3) 右大括號前換行。 4) 右大括號后還有 else 等代碼則不換行;表 示終止的右大括號后必須換行。
2.?【強制】左小括號和字符之間不出現空格;同樣,?右小括號和字符之間也不出現空格;而左大括號?前需要空格。?反例:if (空格 a == b 空格)
3.?【強制】if / for / switch 等保留字與括號之間都必 須加空格。
4.?【強制】任何二目、三目運算符的左右兩邊都需?要加一個空格。?說明:運算符包括賦值運算符= 、邏輯運算符&&、 加減乘除符號等。
5.?【強制】采用?tab 字符縮進,寬度設置為 4 個 空格
6.?【強制】單行字符數限制不超過?120 個,超出 需要換行,換行時遵循如下原則:
- 第二行相對第一行縮進一個 tab,從第三行 開始,不再繼續縮進。
- 運算符與上文一起作為結尾。
- 方法調用的點符號與上文一起作為結尾。
- 方法調用中的多個參數需要換行時,在逗號 后進行。
- 在括號前不要換行
7.【強制】函數參數在定義和傳入時,多個參數逗?號后邊必須加空格。
控制語句
1.【強制】在一個 switch 塊內,每個 case 無需聲 明 break 來 終 止 , 如 果 想 順 序 執 行 使 用 fallthrough ;在一個 switch 塊內,都必須包含 一個 default 語句并且放在最后,即使它什么代 碼也沒有。
2.【強制】在高并發場景中,避免使用”等于”判 斷作為中斷或退出的條件。 說明:如果并發控制沒有處理好,容易產生等值 判斷被“擊穿”的情況,使用大于或小于的區間 判斷條件來代替。 反例:判斷剩余獎品數量等于 0 時,終止發放 獎品,但因為并發處理錯誤導致獎品數量瞬間變成了負數, 這樣的話,活動無法終止。
3.【推薦】表達異常的分支時,少用 if-else 方式, 這種方式可以改寫成:
if condition { … return obj; } // 接著寫 else 的業務邏輯代碼;
說明:如果非使用 if()…else if()…else…方式表 達邏輯,避免后續代碼維護困難,
【強制】請勿 超過 3 層。
正例:超過 3 層的 if-else 的邏輯判斷代碼可 以使用衛語句、策略模式、狀態模式等來實現, 其中衛語句即代碼邏輯先考慮失敗、異常、中斷、 退出等直接返回的情況,以方法多個出口的方 式,解決代碼中判斷分支嵌套的問題,這是逆向 思維的體現。
4.?【參考】下列情形,需要進行參數校驗:
- 調用頻次低的方法。
- 執行時間開銷很大的方法。此情形中,參數 校驗時間幾乎可以忽略不計,但如果因為參數錯 誤導致中間執行回退,或者錯誤,那得不償失。
- 需要極高穩定性和可用性的方法。
- 對 外 提 供 的 開 放 接 口 , 不 管 是 RPC/API/HTTP 接口。
- 敏感權限入口。
5.?【參考】下列情形,不需要進行參數校驗:
- 極有可能被循環調用的方法。但在方法說明 里必須注明外部參數檢查要求。
- 底層調用頻度比較高的方法。畢竟是像純凈 水過濾的最后一道,參數錯誤不太可能到底層才 會暴露問題。一般 DAO 層與 Service 層都在 同一個應用中,部署在同一臺服務器中,所以 DAO 的參數校驗,可以省略。
雜項
1.?【強制】在使用正則表達式時,利用好其預編譯?功能,可以有效加快正則匹配速度。
?正例:
?// 預編譯當前正則表達式re, _ := regexp.Compile("^hel+o") // 是否匹配指定字符串 isMatch := re.MatchString(“hello world”)
2.?【推薦】及時清理不再使用的代碼段或配置信息。?說明:對于垃圾代碼或過時配置,堅決清理干凈,?避免程序過度臃腫,代碼冗余。?正例:對于暫時被注釋掉,后續可能恢復使用的?代碼片斷,在注釋代碼上方,統一規定使用三個?斜杠(///)來說明注釋掉代碼的理由。
異常日志
1.?【強制】使用控制流機制應對錯誤,通過從函數?返回錯誤作為附加返回值來指示錯誤,如果函數?有多個返回值,習慣上將錯誤值作為最后一個結?果返回。如果錯誤只有一種情況,結果通常設置為布爾類型。nil 值表示沒有錯誤。 正例:res, err := somepkgAction()
2.?【強制】對于總是成功返回的函數,不必返回錯誤。
3.?【強制】錯誤信息的首字母小寫且避免換行
更多
還會更新更多優雅的規范實踐...
沒有規矩不成方圓,團隊開發中只有嚴格按照規范進行,才能避免開發一時爽,維護火葬場的困頓局面~
原文鏈接:https://juejin.cn/post/7086094606856618014
相關推薦
- 2022-06-12 C語言數據結構中堆排序的分析總結_C 語言
- 2022-04-26 Jquery實現多選下拉列表左右移動_jquery
- 2023-01-14 Python?使用pip在windows命令行中安裝HDF?reader包的操作方法_python
- 2022-07-19 Angular @Injectable 注解的工作原理淺析
- 2022-04-30 DataGridView控件常用屬性介紹_C#教程
- 2023-05-06 react中定義變量并使用方式_React
- 2022-07-28 C語言實現會員計費系統_C 語言
- 2023-01-13 Qt中QList與QLinkedList類的常用方法總結_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支