Effective Go summary

ninetyhe

格式

程序統(tǒng)?使? ”gofmt“ 進(jìn)行格式化;如果使用的IDE是Goland可以按照如下進(jìn)行配置:PrePerences -> Tools -> FileWatcher(如果沒(méi)有在plugins安裝) :添加 go fmt;

推薦一并添加:golangci-lint 和 goimports。這樣就可以進(jìn)?語(yǔ)法檢查和?動(dòng)處理導(dǎo)入和刪除包注釋

// ?注釋?式,?于簡(jiǎn)單的方法和字段注釋

/* */ 塊注釋方式叭喜,本書(shū)推薦在每一個(gè)包前面注釋?zhuān)f(shuō)明該包的主要作用

? /*

? function: do xxx

? */

? package regexp

名字

Go語(yǔ)?言的命名?小寫(xiě)跨晴,決定了該方法或者該類(lèi)是否公有還是私有,本書(shū)推薦如果?法不對(duì)外調(diào)用根吁,首字?建議小寫(xiě)员淫,如果需要跨包調(diào)?則?字?需要大寫(xiě);

包的命名統(tǒng)一使?用小寫(xiě),并且不應(yīng)該使?下劃線或者駝峰击敌。(這點(diǎn)表示有點(diǎn)別扭介返,如果名字真的過(guò)長(zhǎng)的話,可讀性會(huì)很差) Get/Set:Go不提供對(duì)Get和Set支持沃斤,但是推薦?己實(shí)現(xiàn)圣蝎,但是對(duì)于Get建議直接??字母代替,例如:如果你有一個(gè)域叫做owner(?寫(xiě)轰枝,不被導(dǎo)出)捅彻,則Get方法應(yīng)該叫做 Owner (大寫(xiě),被導(dǎo)出)鞍陨,?不是 GetOwner (個(gè)人覺(jué)得有點(diǎn)反人類(lèi)步淹,?且protobuf generate 的pb文件的字段也是是 Getxx )。這里聯(lián)想到?前我們??用的gRPC诚撵,看到很多同學(xué)的字段命名都是大駝峰的缭裆,開(kāi)始還以為gRPC有特殊不同的規(guī)范,后來(lái)查閱了官網(wǎng)更加肯定寿烟,對(duì)象的屬性要?駝峰澈驼,字段的訪問(wèn)需要通過(guò)Get和Set來(lái)訪問(wèn)!?法命名:單個(gè)方法的接?口使?方法名加上“er”后綴來(lái)命名,或者類(lèi)似的修改來(lái)構(gòu)造?個(gè)施動(dòng)者名詞

分號(hào)

Go語(yǔ)?省略分號(hào); {} 中的左 { 不能換行;條件語(yǔ)句省略 ()

控制結(jié)構(gòu)

Go中的循環(huán)結(jié)構(gòu)只用 for 語(yǔ)句筛武,主要分為以下三種:

// 傳統(tǒng)的for寫(xiě)法 for init; condition; post { }

// 對(duì)應(yīng)其他語(yǔ)言中 while for condition { }

//?直循環(huán) for { }

函數(shù)

?持多返回值缝其,Go語(yǔ)?支持函數(shù)返回多個(gè)返回值,本書(shū)推薦也給返回值命名徘六,這樣對(duì)于以下int值對(duì)應(yīng)哪

個(gè)就值就??了然 例例如:

func (file *File) Write(b []byte) (n int, m int, err error)

延時(shí)執(zhí)行defer;這是一種不不尋常但又很有效的方法内边,?于處理類(lèi)似于不管函數(shù)通過(guò)哪個(gè)執(zhí)行路徑返回,

資源都必須要被釋放的情況待锈。經(jīng)常?用于鏈接斷開(kāi)漠其,釋放鎖或者關(guān)閉IO如果需要將?些值初始化,或者在代碼執(zhí)行前調(diào)?,可以在 init 函數(shù)實(shí)現(xiàn),該函數(shù)會(huì)優(yōu)先被執(zhí)?;

數(shù)據(jù)

Go語(yǔ)?言使?new和make分配原語(yǔ); new ?于給T類(lèi)型的分配內(nèi)存和屎,但是并不會(huì)初始化內(nèi)存拴驮,只是將其置為0; make 不同于 new ,它用于創(chuàng)建 silence 柴信, map 和 channel 套啤,并返回一個(gè)初始化(?不是置0),類(lèi)型給T的值颠印。如果需要獲得一個(gè)顯式的指針纲岭,就必須只?用 new 分配。

構(gòu)造器 :本書(shū)推薦結(jié)構(gòu)體的屬性值盡量不要有空或者空线罕,通過(guò)構(gòu)造?對(duì)其初始化;

數(shù)組 :在Go中:數(shù)組是值止潮。將?個(gè)數(shù)組賦值給另一個(gè),會(huì)拷?所有的元素;特別是钞楼,如果你給函數(shù)傳遞?個(gè)數(shù)組喇闸,其將收到一個(gè)數(shù)組的拷貝,?不是它的指針;組的大小是其類(lèi)型的一部分询件。類(lèi)型

[10]int 和 [20]int 是不同的燃乍。

切片 :切?持有對(duì)底層數(shù)組的引用,如果你將?個(gè)切?賦值給另?個(gè)宛琅,?者都將引用同?個(gè)數(shù)組刻蟹,或你將切片的值進(jìn)行修改,則原數(shù)組的內(nèi)容也將發(fā)?改變

字典 :同切片一樣嘿辟,map持有對(duì)底層數(shù)據(jù)結(jié)構(gòu)的引用舆瘪。如果將map傳遞給函數(shù),其對(duì)map的內(nèi)容做了改變红伦,則這些改變對(duì)于調(diào)?者是可?的英古。如果像判斷Map釋放包含該元素,需要使用 :

//感覺(jué)好蠢昙读,并沒(méi)有像Java那樣有contains key或者contains value召调,//如果像?便使?且避免代碼寫(xiě)成一坨,建議??實(shí)現(xiàn)一個(gè)?法收斂該邏輯if value,ok := map[key];ok{

// if exist do some

}

//?不建議使?以下?式:value, ret := map1["key"]

if ret == true{

fmt.Print("map1[\"key\"]存在蛮浑,值為:", i)

} else {

fmt.Print("map1[\"key\"],不存在\n")

}

初始化

常量 在編譯的時(shí)候就被創(chuàng)建唠叛,并且只能是數(shù)字,字符(附文)沮稚,字符串或者布爾類(lèi)型玻墅。由于編譯限制,

表達(dá)式必須為能被編譯器求值的常量表達(dá)式壮虫, 例如:// 常量表達(dá)式

1<<3

// ?常量表達(dá)式,在const不可使用math.Sin(math.Pi/4)

init函數(shù) 如果需要將一些值初始化,或者需要預(yù)先調(diào)??法函數(shù)囚似,可以在 int 函數(shù)中實(shí)現(xiàn);例如:

func init() {

//需要初始化調(diào)用方法

initFunction(a interface{},b interface{})

// 初始化變量

initParam

}

接?

通過(guò)法與接口剩拢,Go語(yǔ)?定義了一種與java/C++等OOP語(yǔ)言截然不同的“繼承”的形態(tài)。通過(guò)實(shí)現(xiàn)接口定

義的方法饶唤,便可將reciever的類(lèi)型變量賦值給接?類(lèi)型變量徐伐,通過(guò)接?類(lèi)型變量來(lái)調(diào)用到reciever類(lèi)型的

?法 例如:

//定義了一個(gè)接口geometry表示幾何類(lèi)型type thisIsInterface interface {

? ? funcA() int32

? ? funcB(bool)

}

//實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)兩個(gè)方法type IntImpl struct {

A, B float64

}

//在Go中,實(shí)現(xiàn)接?募狂,只需要實(shí)現(xiàn)該接口定義的所有方法即可

//A接口方法實(shí)現(xiàn)

? func (r * IntImpl) funcA(res float64) {

? ? A *= res

? ? B *= res

}

func (r * IntImpl) funcB() float64 {

? ? return r.A * r.B

}

//可以把rect和circle類(lèi)型的變量量作為實(shí)參

//傳遞給geometry接口類(lèi)型的變量

func measure (i thisIsInterface){

? ? fmt.Print("i 's area:",i.funcA(),"\n")

? ? i.funcB(2)

? ? fmt.Print("after funcB , funcA :",i.funcA(),"\n")

}

func main() {

? ? i := IntImpl{A: 10, B: 5}

? ? measure(&i)

}

并發(fā)

Gorutine 輕量級(jí)并發(fā)的函數(shù)執(zhí)行線索办素,創(chuàng)建開(kāi)銷(xiāo)初始化棧空間?較?祸穷,會(huì)根據(jù)實(shí)際需要堆的空間分配或

者釋放額外空間Gorutine與操作系統(tǒng)線程間采用“多對(duì)多”的映射?方式性穿,其他Gorutines不會(huì)因?yàn)槠渲?一個(gè)Gorutines阻塞后

?阻塞

在函數(shù)前加 go 關(guān)鍵字就可以創(chuàng)建?個(gè)Gorutine并調(diào)?該函數(shù)?法。當(dāng)該函數(shù)執(zhí)行完成之后隱式推出(類(lèi)似于Java中的 Thread )

Channel:于map類(lèi)似雷滚,也是通過(guò) make 進(jìn)?行行分配需曾,如果創(chuàng)建的時(shí)候指定?小,如果?零則即創(chuàng)建一個(gè)

緩沖區(qū)祈远。如果是零呆万,則是?無(wú)緩沖的channel或同步channel

例例如:

stringBuffer := make(chan string,10)

value := <- stringBuffer

并行實(shí)現(xiàn)方式:可以創(chuàng)建多個(gè)go func 并行執(zhí)?多個(gè)函數(shù),然后通過(guò)sync.WaitGroup來(lái)實(shí)現(xiàn)阻塞等并?的結(jié)果(類(lèi)似于Java中的 CountDownlunch )车份,但是功能相當(dāng)簡(jiǎn)陋陋谋减,功能相差更更遠(yuǎn)

互斥: 通過(guò)sync.Mutex可以創(chuàng)建鎖進(jìn)行互斥,例例如:

import (

"sync"

"runtime"

"fmt"

)

var {

//共享變量

num int

wg sync.WaitGroup

//鎖

lock sync.Mutex

}

func Add(){

? ? defer wg.Done()

? ? for count := 0;ciunt < 2; count++{

? ? ? ? // lock

}

}

lock.Lock()

{

? ? value := num

? ? value++

? ? num = value

}

// release lock

lock.Unlock()

func main{

? ? wg.Add(2)

? ? go Add()

? ? go Add()

? ? wg.Wait()

? ? fmt.Printf("result is : %d\n", num)

}

結(jié)果如下:

result is : 4

類(lèi)型斷?

Go?面對(duì)類(lèi)型判斷有兩種: value扫沼,ok := element.(T) 當(dāng)然也可以直接這樣用 (不推

薦) value:=element.(T) 這樣的話出爹,?旦出錯(cuò)就會(huì)產(chǎn)?運(yùn)?錯(cuò)誤,不推薦使用;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充甚,一起剝皮案震驚了整個(gè)濱河市以政,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伴找,老刑警劉巖盈蛮,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異技矮,居然都是意外死亡抖誉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)衰倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袒炉,“玉大人,你說(shuō)我怎么就攤上這事樊零∥掖牛” “怎么了孽文?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)夺艰。 經(jīng)常有香客問(wèn)我芋哭,道長(zhǎng),這世上最難降的妖魔是什么郁副? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任减牺,我火速辦了婚禮,結(jié)果婚禮上存谎,老公的妹妹穿的比我還像新娘拔疚。我一直安慰自己,他們只是感情好既荚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布稚失。 她就那樣靜靜地躺著,像睡著了一般固以。 火紅的嫁衣襯著肌膚如雪墩虹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天憨琳,我揣著相機(jī)與錄音诫钓,去河邊找鬼。 笑死篙螟,一個(gè)胖子當(dāng)著我的面吹牛菌湃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遍略,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惧所,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绪杏?” 一聲冷哼從身側(cè)響起下愈,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕾久,沒(méi)想到半個(gè)月后势似,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僧著,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年履因,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盹愚。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅迄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皆怕,到底是詐尸還是另有隱情毅舆,我是刑警寧澤西篓,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站朗兵,受9級(jí)特大地震影響污淋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜余掖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礁鲁。 院中可真熱鬧盐欺,春花似錦、人聲如沸仅醇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)析二。三九已至粉洼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶摄,已是汗流浹背属韧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤吓,地道東北人宵喂。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像会傲,于是被迫代替她去往敵國(guó)和親锅棕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 在之前的課程中淌山,我們已經(jīng)學(xué)習(xí)了進(jìn)程相關(guān)的知識(shí)裸燎。進(jìn)程是計(jì)算機(jī)程序被執(zhí)行的一個(gè)實(shí)例(instance),一個(gè)進(jìn)程可能由...
    夏威夷的芒果閱讀 905評(píng)論 0 2
  • 數(shù)組 和C語(yǔ)言一樣,Go語(yǔ)言中也有數(shù)組的概念, Go語(yǔ)言中的數(shù)組也是用于保存一組相同類(lèi)型的數(shù)據(jù) 和C語(yǔ)言一樣,Go...
    極客江南閱讀 1,200評(píng)論 0 2
  • 一泼疑、數(shù)據(jù)類(lèi)型轉(zhuǎn)換 https://studygolang.com/articles/10838 package m...
    蓓蓓的萬(wàn)能男友閱讀 1,063評(píng)論 0 1
  • Golang是我最喜歡的一門(mén)語(yǔ)言德绿,它簡(jiǎn)潔、高效王浴、易學(xué)習(xí)脆炎、開(kāi)發(fā)效率高、還可以編譯成機(jī)器碼… 雖然它一出世氓辣,就飽受關(guān)注...
    盤(pán)木閱讀 3,544評(píng)論 0 7
  • Go語(yǔ)言數(shù)據(jù)類(lèi)型 Go語(yǔ)言本質(zhì)是用C語(yǔ)言編寫(xiě)的一套高級(jí)開(kāi)發(fā)語(yǔ)言, 所以Go語(yǔ)言中的數(shù)據(jù)類(lèi)型大部分都是由C語(yǔ)言演變而...
    極客江南閱讀 919評(píng)論 0 6