一、變量命名規范
變量命名一般采用駝峰式,當遇到特有名詞(縮寫或簡稱,如DNS)的時候,特有名詞根據是否私有全部大寫或小寫。例子:
var apiClient var URLString
二、常量命名規范
同變量規則,力求語義表達完整清楚,不要嫌名字長。
如果模塊復雜,為避免混淆,可按功能統一定義在package下的一個文件中。
const todayNews = "Hello" // 如果超過了一個常量應該用括號的方法來組織 const ( systemName = "What" sysVal = "dasdsada" )
三、接口命名規范
單個函數的接口名以 er 為后綴
type Reader interface { Read(p []byte) (n int, err error) } 兩個函數的接口名綜合兩個函數名,如: type WriteFlusher interface { Write([]byte) (int, error) Flush() error } 三個以上函數的接口名類似於結構體名,如: type Car interface { Start() Stop() Drive() }
四、結構體命名規范
結構體名應該是名詞或名詞短語,如Account,Book,避免使用Manager這樣的。如果該數據結構需要序列化,如json, 則首字母大寫, 包括里面的字段。
五、receiver命名規范
golang 中存在receiver 的概念 Receiver 的名稱應該縮寫,應該盡量保持一致, 避免this, super,等其他語言的一些語義關鍵字如下
type A struct{} func (a *A) methodA() { } func (a *A) methodB() { a.methodA() }
六、函數/方法命名規范
由於Golang的特殊性(用大小寫來控制函數的可見性),除特殊的性能測試與單元測試函數之外, 都應該遵循如下原則
- 采用駝峰式。將功能及必要的參數體現在名字中, 不要嫌長, 如updateById,getUserInfo.
- 如果包外不需要訪問請用小寫開頭的函數
- 如果需要暴露出去給包外訪問需要使用大寫開頭的函數名稱
一個典型的函數命名方法如下:
// 注釋一律使用雙斜線, 對象暴露的方法 func (*fileDao) AddFile(file *model.File) bool { result := db.NewRecord(*file) if result { db.Create(file) } return result } // 不需要給包外訪問的函數如下 func removeCommaAndQuote(content string) string { re, _ := regexp.Compile("[\\`\\,]+") return strings.TrimSpace(re.ReplaceAllString(content, "")) }
七、注釋命名規范
每個包都應該有一個包注釋,位於 package 之前。如果同一個包有多個文件,只需要在一個文件中編寫即可;如果你想在每個文件中的頭部加上注釋,需要在版權注釋和 Package前面加一個空行,否則版權注釋會作為Package的注釋。如:
// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package net
每個以大寫字母開頭(即可以導出)的方法應該有注釋,且以該函數名開頭。如:
// Get 會響應對應路由轉發過來的 get 請求 func (c *Controller) Get() { ... }
大寫字母開頭的方法以為着是可供調用的公共方法,如果你的方法想只在本包內掉用,請以小寫字母開發。如:
func (c *Controller) curl() { ... }
注釋應該用一個完整的句子,注釋的第一個單詞應該是要注釋的指示符,以便在 godoc 中容易查找。
注釋應該以一個句點 . 結束。
八、package命名規范
包名用小寫,使用短命名,盡量和標准庫不要沖突。包名統一使用單數形式。
九、文件命名規范
由於文件跟包無任何關系, 而又避免windows大小寫的問題,所以推薦的文件規范如下:
文件名應一律使用小寫, 不同單詞之間用下划線分割, 不用駝峰式,命名應盡可能地見名知意。盡量見名思義,看見文件名就可以知道這個文件下的大概內容.其中測試文件以_test.go結尾,除測試文件外,命名不出現_。