我們必須遵循的 12 個(gè) Go 語言最佳實(shí)踐

1蔚袍、使用 gofmt

2、通過首先處理錯(cuò)誤來避免代碼嵌套

3配名、錯(cuò)誤字符串

4啤咽、錯(cuò)誤處理

5、盡量避免代碼重復(fù)

6渠脉、變量名聲明

7宇整、用類型選擇語句來處理特例

8、在類型選擇語句中聲明變量

9芋膘、重要的代碼要放在源文件的前面

10鳞青、點(diǎn)導(dǎo)入

11、注釋代碼

12为朋、注釋語句規(guī)范

1盼玄、使用 gofmt

對源代碼執(zhí)行 gofmt 命令,會(huì)自動(dòng)修正大部分粗心導(dǎo)致的問題潜腻。幾乎全世界的 Go 語言開發(fā)者都在用 gofmt。

gofmt 首先讀取源代碼器仗,然后輸出經(jīng)過縮進(jìn)融涣、垂直對齊甚至規(guī)范注釋后的代碼。

命令和選項(xiàng)

gofmt 文件名 - 輸出格式化后的代碼

gofmt -w 文件名 - 重新格式化代碼并更新文件

gofmt -r'rule' 文件名 - 格式化代碼前執(zhí)行指定的規(guī)則

gofmt 包所在的路徑 - 格式化整個(gè)包下的源文件

下面是使用 gofmt 的一些小例子

文件名:demo.go

packagemain

import"fmt"

// this is demo to format code

// with gofmt command

varaint=10;

varbint=15;

varcstring="Welcome to Agira";

funcprint(){

fmt.Println("Value for a,b and c is : ");

? ? ? ? ? ? ? ? ? ? ? fmt.Println(a);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println((b));

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fmt.Println(c);

? ? ? ? ? ? ? ? ? ? ? ? }

輸入命令:$ gofmt demo.go

輸出結(jié)果:

packagemain

import"fmt"

// this is demo to format code

// with gofmt command

varaint=10

varbint=15

varcstring=? “Welcome to Agira”

funcprint(){

fmt.Println("Value for a,b and c is : ")

? ? ? fmt.Println(a)

? ? ? fmt.Println((b))

? ? ? fmt.Println(c)

}

2精钮、通過首先處理錯(cuò)誤來避免代碼嵌套

避免使用多重條件或者嵌套條件威鹿,當(dāng)我們處理后面的代碼前需要處理錯(cuò)誤,例如下面的代碼

err := request()

iferr !=nil{

// handling error

}else{

// normal code

}

我們可以用下面的方式代替

err := request()

iferr !=nil{

// handling error

return// or continue, etc.

}

// proceed to further

嵌套條件語句越少轨香,讀者越容易理解

如果 if 語句中包含初始化語句忽你,例如:

ifx, err := f(); err !=nil{

// handling error

return

}else{

// use x

}

我們應(yīng)該在代碼中定義一個(gè)短變量,在之后的 if 語句中使用這個(gè)變量

x, err := f()

iferr !=nil{

// handling error

return

}

// use x

3臂容、錯(cuò)誤字符串

錯(cuò)誤字符串首字母不應(yīng)該大寫(除非是以一些特殊的名詞或者縮寫開頭)科雳。

例如:

fmt.Errorf("Something went wrong") 應(yīng)該寫成 fmt.Errorf("something went wrong")

4根蟹、錯(cuò)誤處理

不要用 _ 來忽略錯(cuò)誤。如果一個(gè)函數(shù)可能返回錯(cuò)誤信息糟秘,檢查函數(shù)的返回值 简逮,確認(rèn)函數(shù)是否執(zhí)行成功了。更好的做法是處理這個(gè)錯(cuò)誤并返回尿赚,不然的話如果出現(xiàn)任何異常程序會(huì)產(chǎn)生一個(gè) panic 錯(cuò)誤

不要用 panic 錯(cuò)誤

不要在正常處理流程中使用 panic, 那種情況下可以用 error 和多重返回值散庶。

5、盡可能避免重復(fù)

如果你想在控制模塊和數(shù)據(jù)模塊使用同一個(gè)類型結(jié)構(gòu)凌净,創(chuàng)建一個(gè)公共文件悲龟,在那里聲明這個(gè)類型

6、變量名聲明

在 Go 編程中最好用短的變量名冰寻,尤其是那些作用域比較有限的局部變量

用c而不是lineCount

用i而不是sliceIndex

1须教、基本規(guī)則:距離聲明的地方越遠(yuǎn),變量名需要越具可讀性性雄。

2没卸、作為一個(gè)函數(shù)接收者,1秒旋、2 個(gè)字母的變量比較高效约计。

3、像循環(huán)指示變量和輸入流變量迁筛,用一個(gè)單字母就可以煤蚌。

4、越不常用的變量和公共變量细卧,需要用更具說明性的名字尉桩。

7、用類型選擇語句來處理特例

如果你不確定 iterface{} 是什么類型贪庙,就可以用類型選擇語句

例如:

funcWrite(vinterface{}){

switchv.(type) {

casestring:

s := v.(string)

? fmt.Printf(“%T\n”,s)

caseint:

i := v.(int)

? fmt.Printf(“%T\n”,i)

}

}

8蜘犁、在類型選擇語句中聲明變量

在類型選擇語句中聲明的變量,在每個(gè)分支中會(huì)自動(dòng)轉(zhuǎn)化成正確的類型

例如:

funcWrite(vinterface{}){

switchx := v.(type) {

casestring:

? fmt.Printf(“%T\n”,x)

caseint:

? fmt.Printf(“%T\n”,x)

}

}

9止邮、重要的代碼要放在源文件的前面

如果你有像版權(quán)聲明这橙、構(gòu)建標(biāo)簽、包注釋這樣的重要信息导披,盡量寫在源文件的靠前位置屈扎。 我們可以用空行把導(dǎo)入語句分成若干個(gè)組,標(biāo)準(zhǔn)庫放在最前面撩匕。

import(

"fmt"

"io"

"log"

"golang.org/x/net/websocket"

)

在接下來的代碼中鹰晨,首先寫重要的類型,在最后寫一些輔助型的函數(shù)和類型。

10模蜡、點(diǎn)導(dǎo)入

點(diǎn)導(dǎo)入可以測試循環(huán)依賴漠趁。并且它不會(huì)成為被測試代碼的一部分:

packagefoo_test

import(

"bar/testutil"http:// also imports "foo"

."foo"

)

這樣的情況下,測試代碼不能放在 foo 包中哩牍,因?yàn)樗肓?bar/testutil包棚潦,而它導(dǎo)入了 foo。所以我們用點(diǎn)導(dǎo)入

的形式讓文件假裝是包的一部分膝昆,而實(shí)際上它并不是丸边。除了這個(gè)使用情形外,最好不要用點(diǎn)導(dǎo)入荚孵。因?yàn)樗鼤?huì)讓讀者閱讀代碼時(shí)更加困難妹窖,因?yàn)楹茈y確定像 Quux

這樣的名字是當(dāng)前包的頂層聲明還是引入的包。

11收叶、注釋代碼

在包名字之前添加包相關(guān)的注釋

// Package playground registers an HTTP handler at “/compile” that

// proxies requests to the golang.org playground service.

packageplayground

出現(xiàn)在 godoc 中的標(biāo)識(shí)符骄呼,需要適當(dāng)?shù)淖⑨?/p>

// Author represents the person who wrote and/or is presenting the document.

typeAuthorstruct{

? Elem []Elem

}

// TextElem returns the first text elements of the author details.

// This is used to display the author’ name, job title, and company

// without the contact details.

func(p *Author)TextElem()(elems []Elem){

12、注釋語句規(guī)范

即使注釋語句看上去有一些冗余判没,也需要是一個(gè)完整的句子蜓萄,。這樣會(huì)讓它們在 godoc 中有更的格式化效果澄峰。注釋需要以被注釋的名字開頭嫉沽,以點(diǎn)號(hào)結(jié)尾。

// Request represents a request to run a command.

typeRequeststruct{ …

// Encode writes the JSON encoding of req to w.

funcEncode(w io.Writer, req *Request){ … and so on.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俏竞,一起剝皮案震驚了整個(gè)濱河市绸硕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魂毁,老刑警劉巖玻佩,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異席楚,居然都是意外死亡咬崔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門烦秩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁赦,“玉大人,你說我怎么就攤上這事闻镶。” “怎么了丸升?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵铆农,是天一觀的道長。 經(jīng)常有香客問我,道長墩剖,這世上最難降的妖魔是什么猴凹? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮岭皂,結(jié)果婚禮上郊霎,老公的妹妹穿的比我還像新娘。我一直安慰自己爷绘,他們只是感情好书劝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著土至,像睡著了一般购对。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陶因,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天骡苞,我揣著相機(jī)與錄音,去河邊找鬼楷扬。 笑死解幽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烘苹。 我是一名探鬼主播躲株,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螟加!你這毒婦竟也來了徘溢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤捆探,失蹤者是張志新(化名)和其女友劉穎然爆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黍图,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曾雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了助被。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剖张。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖揩环,靈堂內(nèi)的尸體忽然破棺而出搔弄,到底是詐尸還是另有隱情,我是刑警寧澤丰滑,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布顾犹,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炫刷。R本人自食惡果不足惜擎宝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浑玛。 院中可真熱鬧绍申,春花似錦、人聲如沸顾彰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘央。三九已至涂屁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灰伟,已是汗流浹背拆又。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栏账,地道東北人帖族。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像挡爵,于是被迫代替她去往敵國和親竖般。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容