編寫地道的Go代碼

最地道的Go代碼就是Go的標(biāo)準(zhǔn)庫的代碼,有空的時(shí)候可以多看看Google的工程師是如何實(shí)現(xiàn)的融欧。

1. 注釋

可以通過/* ... */或者//增加注釋, //之后應(yīng)該有個(gè)空格
如果想在每個(gè)文件的頭部加上注釋,需要在版權(quán)注釋和Package前面加一個(gè)空行,否則版權(quán)注釋會(huì)作為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 provides a portable interface for network I/O, including
TCP/IP, UDP, domain name resolution, and Unix domain sockets.
......
*/

package net
......

注:注釋應(yīng)該用一個(gè)完整的句子匠璧,注釋的第一個(gè)單詞應(yīng)該是要注釋的指示符桐款,以便在godoc中容易查找;
注釋應(yīng)該以 . 結(jié)尾咸这;

2. 聲明slice

使用下面這種方式聲明slice:

var s []string

而不是下面這種格式

t := []string{}

注:前者聲明了一個(gè)nilslice, 而后者聲明了一個(gè)長度為0的非nilslice

3. 字符串的大小寫

錯(cuò)誤字符串不應(yīng)該大寫,應(yīng)寫成:

fmt.Errorf("failed to write data.")

而不是寫成:

fmt.Errorf("Failed to write data")

因?yàn)槟д#@些字符串可能和其他字符串相連接媳维,組合后的字符串如果中間有大寫字母開頭的單詞很突兀,除非這些首字母大寫單詞是固定使用的單詞遏暴。

注:縮寫詞必須保持一致侄刽,比如都大寫URL或者小寫url;
常亮一般聲明為MaxLength朋凉,而不是以下劃線分割MAX_LENGTH或者M(jìn)AXLENGTH州丹;

4.處理error而不是panic或者忽略

為了代碼的強(qiáng)健性,不要使用_忽略錯(cuò)誤杂彭,而是要處理每一個(gè)錯(cuò)誤墓毒,盡管代碼寫起來有些繁瑣也不要忽略錯(cuò)誤;

盡量不要使用panic;

5. 一些名稱

包名應(yīng)該使用單數(shù)形式亲怠,比如util,model,而不是utils,models;

Receiver的名稱應(yīng)該縮寫所计,一般使用一個(gè)或兩個(gè)字符作為Receiver的名稱,如:

func (f foo) method {

    ...

}

有些單詞可能有多種寫法团秽,在項(xiàng)目中應(yīng)保持一致主胧,比如Golang采用的寫法:

// marshaling
// unmarshaling
// canceling
// cancelation

而不是:

// marshalling
// unmarshalling
// cancelling
// cancellation

6.空字符串檢查

正確方式:

if s == "" {
    ...
}

而不是:

if len(s) == 0 {
    ...
}

更不是:

if s == nil || s == ""{
    ...
}

7.非空slice檢查

正確方式:

if len(s) > 0 {
    ...
}

而不是:


if s != nil && len(s) > 0 {
    ...
}

8. 直接使用bool值

對(duì)于bool類型的變量var b bool, 直接使用它作為判斷叭首,而不是使用它和true/false進(jìn)行比較
正確方式:

if b {
    ...
}
if !b {
    ...
}

而不是:

if b == true {
    ...
}
if b == false {
    ...
}

9. byte/slice/string相等性比較

var s1 []byte
var s2 []byte

    ...
bytes.Equal(s1, s2) == 0
bytes.Equal(s1, s2) != 0

而不是:

var s1 []byte
var s2 []byte

    ...
bytes.Compare(s1, s2) == 0    
bytes.Compare(s1, s2) != 0

10. 檢查是否包含子字符串

應(yīng)使用strings.ContainesRune, strings.ContainesAny, strings.Contains

11. 復(fù)制slice

使用內(nèi)建函數(shù)copy,而不是遍歷slice逐個(gè)復(fù)制
正確方式

var b1, b2 []byte
copy(b2, b1)

12. 盡量縮短if

正確方式:

  var a, b int
  ...
  return a > b

而不是:

    var a, b int
    ...
    if a > b {
        return true
    } else {
        return false
    }

13.簡化range

正確方式:

    for range m {
        ...
    }

而不是:

       var m map[string]int
       for _ = range m { 
    }
    for _, _ = range m {
    }

14.使用strings.TrimPrefix / strings.TrimSuffix

正確方式:

    var s1 = "a string value"
    var s2 = "a "
    var s3 = strings.TrimPrefix(s1, s2)

而不是:

       var s1 = "a string value"
       var s2 = "a "
       var s3 string
    if strings.HasPrefix(s1, s2) { 
        s3 = s1[len(s2):]
    }

15.append slice

正確方式:

    var a, b []byte
    a = append(b, a...)

而不是:

    var a, b []byte
    for _,v range a {
        append(b, v)
    }

參考文檔

http://colobu.com/2017/02/07/write-idiomatic-golang-codes/

effective go

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踪栋,一起剝皮案震驚了整個(gè)濱河市焙格,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夷都,老刑警劉巖间螟,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異损肛,居然都是意外死亡厢破,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門治拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摩泪,“玉大人,你說我怎么就攤上這事劫谅〖樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵捏检,是天一觀的道長荞驴。 經(jīng)常有香客問我,道長贯城,這世上最難降的妖魔是什么熊楼? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮能犯,結(jié)果婚禮上鲫骗,老公的妹妹穿的比我還像新娘。我一直安慰自己踩晶,他們只是感情好执泰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渡蜻,像睡著了一般术吝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茸苇,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天排苍,我揣著相機(jī)與錄音,去河邊找鬼税弃。 笑死纪岁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的则果。 我是一名探鬼主播幔翰,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼漩氨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遗增?” 一聲冷哼從身側(cè)響起叫惊,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎做修,沒想到半個(gè)月后霍狰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饰及,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔗坯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎含。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宾濒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屏箍,到底是詐尸還是另有隱情绘梦,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布赴魁,位于F島的核電站卸奉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颖御。R本人自食惡果不足惜榄棵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郎嫁。 院中可真熱鬧秉继,春花似錦、人聲如沸泽铛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盔腔。三九已至,卻和暖如春月褥,著一層夾襖步出監(jiān)牢的瞬間弛随,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工宁赤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舀透,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓决左,卻偏偏與公主長得像愕够,于是被迫代替她去往敵國和親走贪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理惑芭,服務(wù)發(fā)現(xiàn)坠狡,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 得到周二例會(huì) 成為一家透明的公司遂跟,這是未來每個(gè)公司將要發(fā)展的方向逃沿。不斷給員工和客戶附能。不是憑公司的發(fā)展理念和口號(hào)...
    潭客富林的家閱讀 216評(píng)論 0 1
  • 細(xì)條葉子白星花幻锁,田園隨處可安家凯亮。 歷經(jīng)一季暑熱苦,結(jié)下串串小梢瓜哄尔。 兩頭尖尖似紡錘触幼,入口甜脆味上佳。 采來權(quán)當(dāng)野果...
    緣wxh閱讀 732評(píng)論 23 26
  • 291976-陳國艷《2017-02-19》 【第8天總結(jié)】 A究飞、目標(biāo)完成情況 1置谦、背誦復(fù)習(xí)2A完成50% 2、聽...
    國艷更文的365天閱讀 157評(píng)論 0 0