Go 語言程式設計規範

滾雪球的哈士奇發表於2019-04-02

1. gofmt 命令

大部分的格式問題可以通過 gofmt 來解決,gofmt 自動格式化程式碼,保證所有的 go 程式碼與官方推薦的格式保持一致,所有格式有關問題,都以gofmt的結果為準。所以,建議在提交程式碼庫之前先執行一下這個命令。

2. 行長

一行最長不超過80個字元,超過的使用換行展示,儘量保持格式優雅。

3. 註釋

在編碼階段應該同步寫好 變數、函式、包 的註釋,最後可以利用 godoc 命令匯出文件。註釋必須是完整的句子,句子的結尾應該用句號作為結尾(英文句號)。註釋推薦用英文,可以在寫程式碼過程中鍛鍊英文的閱讀和書寫能力。而且用英文不會出現各種編碼的問題。

每個包都應該有一個包註釋,一個位於 package 子句之前的塊註釋或行註釋。包如果有多個 go 檔案,只需要出現在一個 go 檔案中即可。

	// ping包實現了常用的ping相關的函式
	package ping 
複製程式碼

4. 命名

需要註釋來補充的命名就不算是好命名。 使用可搜尋的名稱:單字母名稱和數字常量很難從一大堆文字中搜尋出來。 單字母名稱僅適用於短方法中的本地變數,名稱長短應與其作用域相對應。 若變數或常量可能在程式碼中多處使用,則應賦其以便於搜尋的名稱。

做有意義的區分:Product 和 ProductInfo 和 ProductData 沒有區別, NameString 和 Name 沒有區別,要區分名稱,就要以讀者能鑑別不同之處的方式來區分 。

函式命名規則:駝峰式命名,名字可以長但是得把功能,必要的引數描述清楚,
函式名應當是動詞或動詞短語,如 postPayment、deletePage、save。
並依 Javabean 標準加上 get、set、is字首。
例如:xxx + With + 需要的引數名 + And + 需要的引數名 + …..

結構體命名規則:結構體名應該是名詞或名詞短語,
如 Custome、WikiPage、Account、AddressParser,避免使用Manager、Processor、Data、Info、
這樣的類名,類名不應當是動詞。

包名命名規則:包名應該為小寫單詞,不要使用下劃線或者混合大小寫。
介面命名規則:單個函式的介面名以”er”作為字尾,如 Reader,Writer。介面的實現則去掉“er”。
複製程式碼
複製程式碼
	type Reader interface {
        Read(p []byte) (n int, err error)
	}

	// 多個函式介面
	type WriteFlusher interface {
    	Write([]byte) (int, error)
    	Flush() error
	}
複製程式碼

5. 常量

常量均需使用全部大寫字母組成,並使用下劃線分詞:

	const APP_VER = "1.0"
	// 如果是列舉型別的常量,需要先建立相應型別:

	type Scheme string

	const (
   	 HTTP  Scheme = "http"
    	HTTPS Scheme = "https"
	)
複製程式碼

6. 變數

變數命名基本上遵循相應的英文表達或簡寫,在相對簡單的環境(物件數量少、針對性強)中, 可以將一些名稱由完整單詞簡寫為單個字母,例如:

user 可以簡寫為 u
userID 可以簡寫 uid
// 若變數型別為 bool 型別,則名稱應以 Has, Is, Can 或 Allow 開頭:

var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
複製程式碼

7. 變數命名慣例

變數名稱一般遵循駝峰法,但遇到特有名詞時,需要遵循以下規則:

如果變數為私有,且特有名詞為首個單詞,則使用小寫,

如:apiClient其它情況都應當使用該名詞原有的寫法,

如 APIClient、repoID、UserID 錯誤示例:UrlArray,應該寫成 urlArray 或者 URLArray

    //下面列舉了一些常見的特有名詞:
	"API""ASCII""CPU""CSS""DNS""EOF",GUID","HTML","HTTP",
	"HTTPS","ID","IP","JSON","LHS","QPS","RAM","RHS"	"RPC", "SLA",
	"SMTP","SSH","TLS","TTL","UI","UID","UUID","URI","URL", "UTF8",
	"VM","XML","XSRF","XSS"
複製程式碼

8. struct規範

struct申明和初始化格式採用多行,定義如下:

type User struct{
	Username  string
	Email     string
}
初始化如下:

u := User{
 Username: "test",
	Email:    "test@gmail.com",
}
複製程式碼

9. panic

儘量不要使用panic,除非你知道你在做什麼

10. import

對 import 的包進行分組管理,用換行符分割,而且標準庫作為分組的第一組。 如果你的包引入了三種型別的包,標準庫包,程式內部包,第三方包, 建議採用如下方式進行組織你的包

複製程式碼
package main

import (
    "fmt"
    "os"

    "kmg/a"
    "kmg/b"

    "code.google.com/a"
    "github.com/b"
)
複製程式碼
	goimports 會自動幫你格式化
複製程式碼

11. 引數傳遞

對於少量資料,不要傳遞指標 對於大量資料的 struct 可以考慮使用指標 傳入的引數是 map,slice,chan 不要傳遞指標, 因為 map,slice,chan 是引用型別,不需要傳遞指標的指標

12. 單元測試

單元測試檔名命名規範:

	 example_test.go

測試用例的函式名稱必須以 Test 開頭,例如:

	func TestExample
複製程式碼

相關文章