Golang編碼規(guī)范

  • gofmt

大部分的格式問題可以通過gofmt解決缎岗,gofmt自動格式化代碼,保證所有的go代碼與官方推薦的格式保持一致白粉,于是所有格式有關問題传泊,都以gofmt的結果為準。

  • 行長

一行最長不超過80個字符鸭巴,超過的使用換行展示眷细,盡量保持格式優(yōu)雅。

  • 注釋

在編碼階段應該同步寫好變量鹃祖、函數(shù)溪椎、包的注釋,最后可以利用godoc導出文檔恬口。注釋必須是完整的句子校读,句子的結尾應該用句號作為結尾(英文句號)。注釋推薦用英文祖能,可以在寫代碼過程中鍛煉英文的閱讀和書寫能力地熄。而且用英文不會出現(xiàn)各種編碼的問題。
每個包都應該有一個包注釋芯杀,一個位于package子句之前的塊注釋或行注釋。包如果有多個go文件,只需要出現(xiàn)在一個go文件中即可揭厚。

// ping包實現(xiàn)了常用的ping相關的函數(shù)
package ping

導出函數(shù)注釋却特,第一條語句應該為一條概括語句,并且使用被聲明的名字作為開頭筛圆。

// 求a和b的和裂明,返回sum。
func Myfunction(sum int) (a, b int) {
  • 命名

    • 需要注釋來補充的命名就不算是好命名太援。
    • 使用可搜索的名稱:單字母名稱和數(shù)字常量很難從一大堆文字中搜索出來闽晦。單字母名稱僅適用于短方法中的本地變量,名稱長短應與其作用域相對應提岔。若變量或常量可能在代碼中多處使用仙蛉,則應賦其以便于搜索的名稱。
    • 做有意義的區(qū)分:Product和ProductInfo和ProductData沒有區(qū)別碱蒙,NameString和Name沒有區(qū)別荠瘪,要區(qū)分名稱,就要以讀者能鑒別不同之處的方式來區(qū)分 赛惩。
    • 函數(shù)命名規(guī)則:駝峰式命名哀墓,名字可以長但是得把功能,必要的參數(shù)描述清楚喷兼,函數(shù)名名應當是動詞或動詞短語篮绰,如postPayment、deletePage季惯、save吠各。并依Javabean標準加上get、set星瘾、is前綴走孽。例如:xxx + With + 需要的參數(shù)名 + And + 需要的參數(shù)名 + .....
    • 結構體命名規(guī)則:結構體名應該是名詞或名詞短語,如Custome琳状、WikiPage磕瓷、Account、AddressParser念逞,避免使用Manager困食、Processor、Data翎承、Info硕盹、這樣的類名,類名不應當是動詞叨咖。
    • 包名命名規(guī)則:包名應該為小寫單詞瘩例,不要使用下劃線或者混合大小寫啊胶。
    • 接口命名規(guī)則:單個函數(shù)的接口名以"er"作為后綴,如Reader,Writer垛贤。接口的實現(xiàn)則去掉“er”焰坪。
type Reader interface {
        Read(p []byte) (n int, err error)
}

兩個函數(shù)的接口名綜合兩個函數(shù)名

type WriteFlusher interface {
    Write([]byte) (int, error)
    Flush() error
}

三個以上函數(shù)的接口名,抽象這個接口的功能聘惦,類似于結構體名

type Car interface {
    Start([]byte)
    Stop() error
    Recover()
}
  • 常量

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

const APP_VER = "1.0"

如果是枚舉類型的常量,需要先創(chuàng)建相應類型:

type Scheme string

const (
    HTTP  Scheme = "http"
    HTTPS Scheme = "https"
)

如果模塊的功能較為復雜善绎、常量名稱容易混淆的情況下黔漂,為了更好地區(qū)分枚舉類型,可以使用完整的前綴:

type PullRequestStatus int

const (
    PULL_REQUEST_STATUS_CONFLICT PullRequestStatus = iota
    PULL_REQUEST_STATUS_CHECKING
    PULL_REQUEST_STATUS_MERGEABLE
)
  • 變量

變量命名基本上遵循相應的英文表達或簡寫,在相對簡單的環(huán)境(對象數(shù)量少禀酱、針對性強)中炬守,可以將一些名稱由完整單詞簡寫為單個字母,例如:
* user 可以簡寫為 u
* userID 可以簡寫 uid
若變量類型為 bool 類型比勉,則名稱應以 Has, Is, Can 或 Allow 開頭:

var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
  • 變量命名慣例

變量名稱一般遵循駝峰法劳较,但遇到特有名詞時,需要遵循以下規(guī)則:

* 如果變量為私有浩聋,且特有名詞為首個單詞观蜗,則使用小寫,如 apiClient
* 其它情況都應當使用該名詞原有的寫法衣洁,如 APIClient墓捻、repoID、UserID
* 錯誤示例:UrlArray坊夫,應該寫成urlArray或者URLArray

下面列舉了一些常見的特有名詞:

// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{
    "API":   true,
    "ASCII": true,
    "CPU":   true,
    "CSS":   true,
    "DNS":   true,
    "EOF":   true,
    "GUID":  true,
    "HTML":  true,
    "HTTP":  true,
    "HTTPS": true,
    "ID":    true,
    "IP":    true,
    "JSON":  true,
    "LHS":   true,
    "QPS":   true,
    "RAM":   true,
    "RHS":   true,
    "RPC":   true,
    "SLA":   true,
    "SMTP":  true,
    "SSH":   true,
    "TLS":   true,
    "TTL":   true,
    "UI":    true,
    "UID":   true,
    "UUID":  true,
    "URI":   true,
    "URL":   true,
    "UTF8":  true,
    "VM":    true,
    "XML":   true,
    "XSRF":  true,
    "XSS":   true,
}
  • struct規(guī)范

struct申明和初始化格式采用多行:

定義如下:

type User struct{
    Username  string
    Email     string
}

初始化如下:

u := User{
    Username: "test",
    Email:    "test@gmail.com",
}
  • 控制結構

if
if接受初始化語句砖第,約定如下方式建立局部變量

if err := file.Chmod(0664); err != nil {
    return err
}

for
采用短聲明建立局部變量

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

return
盡早return:一旦有錯誤發(fā)生,馬上返回

f, err := os.Open(name)
if err != nil {
    return err
}
d, err := f.Stat()
if err != nil {
    f.Close()
    return err
}
codeUsing(f, d)
  • 錯誤處理

    • error作為函數(shù)的值返回,必須對error進行處理
    • 錯誤描述如果是英文必須為小寫环凿,不需要標點結尾
    • 采用獨立的錯誤流進行處理

不要采用下面的處理錯誤寫法

    if err != nil {
        // error handling
    } else {
        // normal code
    }

采用下面的寫法

    if err != nil {
        // error handling
        return // or continue, etc.
    }
    // normal code

使用函數(shù)的返回值時梧兼,則采用下面的方式

x, err := f()
if err != nil {
    // error handling
    return
}
// use x
  • panic

盡量不要使用panic,除非你知道你在做什么

  • import

對import的包進行分組管理智听,用換行符分割羽杰,而且標準庫作為分組的第一組。如果你的包引入了三種類型的包到推,標準庫包考赛,程序內部包,第三方包莉测,建議采用如下方式進行組織你的包

package main

import (
    "fmt"
    "os"

    "kmg/a"
    "kmg/b"

    "code.google.com/a"
    "github.com/b"
)

在項目中不要使用相對路徑引入包:

// 錯誤示例
import “../net”

// 正確的做法
import “github.com/repo/proj/src/net”

goimports會自動幫你格式化

  • 參數(shù)傳遞

    • 對于少量數(shù)據(jù)颜骤,不要傳遞指針
    • 對于大量數(shù)據(jù)的struct可以考慮使用指針
    • 傳入?yún)?shù)是map,slice捣卤,chan不要傳遞指針忍抽,因為map八孝,slice,chan是引用類型鸠项,不需要傳遞指針的指針
  • 單元測試

單元測試文件名命名規(guī)范為 example_test.go
測試用例的函數(shù)名稱必須以 Test 開頭唆阿,例如:TestExample



歡迎關注我的博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锈锤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闲询,老刑警劉巖久免,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扭弧,居然都是意外死亡阎姥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門鸽捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呼巴,“玉大人,你說我怎么就攤上這事御蒲∫赂希” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵厚满,是天一觀的道長府瞄。 經(jīng)常有香客問我,道長碘箍,這世上最難降的妖魔是什么遵馆? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮丰榴,結果婚禮上货邓,老公的妹妹穿的比我還像新娘。我一直安慰自己四濒,他們只是感情好换况,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峻黍,像睡著了一般复隆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姆涩,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天挽拂,我揣著相機與錄音,去河邊找鬼骨饿。 笑死亏栈,一個胖子當著我的面吹牛台腥,可吹牛的內容都是我干的。 我是一名探鬼主播绒北,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼黎侈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闷游?” 一聲冷哼從身側響起峻汉,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脐往,沒想到半個月后休吠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡业簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年瘤礁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅尤。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡柜思,死狀恐怖,靈堂內的尸體忽然破棺而出巷燥,到底是詐尸還是另有隱情赡盘,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布矾湃,位于F島的核電站亡脑,受9級特大地震影響,放射性物質發(fā)生泄漏邀跃。R本人自食惡果不足惜霉咨,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拍屑。 院中可真熱鬧途戒,春花似錦、人聲如沸僵驰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒜茴。三九已至星爪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粉私,已是汗流浹背顽腾。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诺核,地道東北人抄肖。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓久信,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漓摩。 傳聞我的和親對象是個殘疾皇子裙士,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容