一、項目目錄結構規范
文件名命名規范
AudioMarkGo/
├── AudioMarkGo 編譯后文件
├── conf 配置文件目錄
│ ├── app.conf 主配置文件,開發環境以及測試環境引入dev;生產環境則開啟prod。
│ ├── dev.conf
│ └── prod.conf
├── controller 項目代碼,項目主題邏輯請按照規范命名。
│ └── userCenter
│ ├── resume.go
│ └── taskList.go
├── fun 項目中需要的共用方法
│ ├── audioMarkGo.go 項目中共用方法
│ ├──userCenter.go 項目中用中心共用方法
│ ├── common.go 整個項目的共用方法
├── lang 平臺語言切換配置
│ └── zh.ini
├── main.go 項目主函數
├── models 項目的數據庫操作
│ ├── amProjectMember.go 數據庫映射表
│ ├── mongodb.go mongoDB 數據庫連接操作
│ ├── mysql.go mysql數據庫連接操作
│ ├── redis.go redis 數據庫連接操作
├── routers 項目路由
│ └── router.go 項目路由信息
├── swagger 自動化Api文檔
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── index.html
│ ├── oauth2-redirect.html
│ ├── swagger-ui-bundle.js
│ ├── swagger-ui-bundle.js.map
│ ├── swagger-ui-standalone-preset.js
│ ├── swagger-ui-standalone-preset.js.map
│ ├── swagger-ui.css
│ ├── swagger-ui.css.map
│ ├── swagger-ui.js
│ ├── swagger-ui.js.map
│ ├── swagger.json
│ └── swagger.yml
└── tests 項目測試文件
文件名命名規范
小駝峰命名方式,看見文件名就可以知道這個文件下的大概內容。例如:audioMark
二、命名規范
包名
包名用小寫,與外層文件夾名稱盡量相同,盡量和標準庫不要沖突
接口名
接口名以”er”作為后綴,如Reader,Writer
//接口的實現則去掉“er”
type Reader interface {
Read(p []byte) (n int, err error)
}
變量
全局變量:采用駝峰命名方式,僅限在包內的全局變量;
var ProjectName string
//如多組變量則使用,組和聲明或者平行賦值
var(
ProjectName string
)
局部變量:采用小駝峰命名方式,注意聲明局部變量盡量使用 :=
projectName := "name"
常量
全部大寫可以使用采用下劃線
const DIR_NAME = "test"
//如多組常量則使用
const(
DIR_NAME= "test"
PROJECT_NAME = "test"
)
函數
使用駝峰命名方式,需要包外使用則開頭使用大寫,否則使用小駝峰。
三、import 規范
引入多個包文件
//標準庫包,程序內部包,第三方包,在項目中不要使用相對路徑引入包
import (
"encoding/json"
"strings"
"myproject/models"
"myproject/controller"
"git.obc.im/obc/utils"
"git.obc.im/dep/beego"
"git.obc.im/dep/mysql"
)
四、注釋規范
注釋可以幫我們很好的完成文檔的工作,寫得好的注釋可以方便我們以后的維護。和其他語言類似,go 語言也提供了 /**/ 的塊注釋和 // 的單行注釋兩種注釋風格, 在我們的項目中為了風格的統一,全部使用單行注釋。go 語言自帶的 godoc 工具可以根據注釋生成文檔,生成可以自動生成對應的網站( golang.org 就是使用 godoc 工具直接生成的),注釋的質量決定了生成的文檔的質量。下面從包注釋、結構體(接口)注釋、函數(方法)注釋、代碼邏輯注釋以及注釋規范方面進行說明。
包注釋
每個包都應該有一個包注釋,一個位于package子句之前的塊注釋或行注釋。包如果有多個go文件,只需要出現在一個go文件中(一般是和包同名的文件)即可。 包注釋應該包含下面基本信息(請嚴格按照這個順序,簡介,創建人,創建時間):
// @Title
// @Description
// @Author 創建人 創建時間
// @Update 創建人 修改時間
結構(接口)注釋
每個自定義的結構體或者接口都應該有注釋說明,該注釋對結構進行簡要介紹,放在結構體定義的前一行,格式為: 結構體名, 結構體說明。同時結構體內的每個成員變量都要有說明,該說明放在成員變量的后面(注意對齊),實例如下:
// User , 用戶對象,定義了用戶的基礎信息
type User struct{
UserName string `description:"用戶名稱"`
Email string `description:"郵箱"`
}
函數 注釋
// @Title 標題
// @Description 詳細信息
// @Auth 創建時間 創建人
// @Param 參數類型 參數介紹
// @Return 返回類型 "錯誤信息"
方法 注釋
@Title
這個 API 所表達的含義,是一個文本,空格之后的內容全部解析為 title
@Description
這個 API 詳細的描述,是一個文本,空格之后的內容全部解析為 Description
@Param
參數,表示需要傳遞到服務器端的參數,有五列參數,使用空格或者 tab 分割,五個分別表示的含義如下
參數名
參數類型,可以有的值是 formData、query、path、body、header,formData 表示是 post 請求的數據,query 表示帶在 url 之后的參數,path 表示請求路徑上得參數,例如上面例子里面的 key,body 表示是一個 raw 數據請求,header 表示帶在 header 信息中得參數。
參數類型
是否必須
注釋
@Success
成功返回給客戶端的信息,三個參數,第一個是 status code。第二個參數是返回的類型,必須使用 {} 包含,第三個是返回的對象或者字符串信息,如果是 {object} 類型,那么 bee 工具在生成 docs 的時候會掃描對應的對象,這里填寫的是想對你項目的目錄名和對象,例如 models.ZDTProduct.ProductList 就表示 /models/ZDTProduct 目錄下的 ProductList 對象。
三個參數必須通過空格分隔
@Failure
失敗返回的信息,包含兩個參數,使用空格分隔,第一個表示 status code,第二個表示錯誤信息
@router
路由信息,包含兩個參數,使用空格分隔,第一個是請求的路由地址,支持正則和自定義路由,和之前的路由規則一樣,第二個參數是支持的請求方法,放在 [] 之中,如果有多個方法,那么使用 , 分隔。
如何自動化生成文檔
// @Title Get Product list
// @Description 開發時間 編寫人 Get Product list by some info
// @Success 200 {object} models.ZDTProduct.ProductList
// @Param category_id query int false "category id"
// @Param brand_id query int false "brand id"
// @Param query query string false "query of search"
// @Param segment query string false "segment"
// @Param sort query string false "sort option"
// @Param dir query string false "direction asc or desc"
// @Param offset query int false "offset"
// @Param limit query int false "count limit"
// @Param price query float false "price"
// @Param special_price query bool false "whether this is special price"
// @Param size query string false "size filter"
// @Param color query string false "color filter"
// @Param format query bool false "choose return format"
// @Failure 400 no enough input
// @Failure 500 get products common error
// @router /products [get]
注釋風格
統一使用中文注釋,對于中英文字符之間嚴格使用空格分隔, 這個不僅僅是中文和英文之間,英文和中文標點之間也都要使用空格分隔,例如:
//從 Redis 中批量讀取屬性,對于沒有讀取到的 id , 記錄到一個數組里面,準備從 DB 中讀取
代碼風格
編寫代碼中使用tab鍵對其代碼。
錯誤處理
錯誤處理的原則就是不能丟棄任何有返回err的調用,不要使用 _ 丟棄,必須全部處理。接收到錯誤,要么返回err,或者使用log記錄下來
盡早return:一旦有錯誤發生,馬上返回
盡量不要使用panic,除非你知道你在做什么
錯誤描述如果是英文必須為小寫,不需要標點結尾
采用獨立的錯誤流進行處理
// 錯誤寫法
if err != nil {
} else {
}
// 正確寫法
if err != nil {
return
}