函數(shù)function
go函數(shù)不支持嵌套歼捐、重載和默認(rèn)參數(shù)
但支持以下特性:
無(wú)需聲明原型、不定長(zhǎng)度變參晨汹、多返回值豹储、命名返回值參數(shù)、匿名函數(shù)淘这、閉包
定義函數(shù)使用關(guān)鍵字func剥扣,且左大括號(hào)不能另起一行
函數(shù)也可以作為一種類型使用
defer
執(zhí)行方式類似其他語(yǔ)言的析構(gòu)函數(shù),在函數(shù)體執(zhí)行結(jié)束后按照調(diào)用順序的相反順序逐個(gè)執(zhí)行
即使函數(shù)發(fā)生嚴(yán)重錯(cuò)誤也會(huì)執(zhí)行
支持匿名函數(shù)的調(diào)用
常用于資源清理铝穷、文件關(guān)閉钠怯、解鎖以及記錄時(shí)間等操作
通過(guò)與匿名函數(shù)配合可在return之后修改函數(shù)計(jì)算結(jié)果
如果函數(shù)體內(nèi)某個(gè)變量作為defer時(shí)匿名函數(shù)的參數(shù),則在定義defer時(shí)即已經(jīng)獲得了拷貝氧骤,否則這是引用某個(gè)變量的地址
go沒(méi)有異常機(jī)制呻疹,但有panic和recover模式來(lái)處理錯(cuò)誤
panic可以在任何地方引發(fā),但recover只有在defer調(diào)用的函數(shù)中有效
結(jié)構(gòu)struct
go中的struct與c中struct非常相似筹陵,并且go沒(méi)有class
使用type <Name> struct{}定義結(jié)構(gòu)刽锤,名稱遵循可見(jiàn)性
支持指向自身的指針類型成員
支持匿名結(jié)構(gòu),可用作成員或定義成員變量
匿名結(jié)構(gòu)也可以用于map的值
可以使用字面值對(duì)結(jié)構(gòu)進(jìn)行初始化
允許直接通過(guò)指針來(lái)讀寫(xiě)結(jié)構(gòu)成員
相同類型的成員可進(jìn)行直接拷貝賦值
支持==與朦佩!=比較運(yùn)算符并思,但不支持>或<
支持匿名字段,本質(zhì)上時(shí)定義了以某個(gè)類型名為名稱的字段
嵌入結(jié)構(gòu)作為匿名字段看起來(lái)像繼承语稠,但不是繼承
可以使用匿名字段指針
方法method
go中雖沒(méi)有class宋彼,但依舊有method
通過(guò)顯示說(shuō)明receiver來(lái)實(shí)現(xiàn)與某個(gè)類型的組合
只能為同一個(gè)包中的類型定義方法
receiver可以是類型的值或者指針
不存在方法重載
可以使用值或指針來(lái)調(diào)用方法,編譯器會(huì)自動(dòng)完成轉(zhuǎn)換
從某種意義上來(lái)說(shuō)仙畦,方法是函數(shù)的語(yǔ)法糖
因?yàn)閞eceiver其實(shí)就是方法所接受的第一個(gè)參數(shù)(Method Value vs. Method Expression)
如果外部結(jié)構(gòu)和嵌入結(jié)構(gòu)存在同名方法输涕,則優(yōu)先調(diào)用外部結(jié)構(gòu)的方法
類型別名不會(huì)擁有底層類型所附帶的方法
方法可以調(diào)用結(jié)構(gòu)中的非公開(kāi)字段
接口interface
接口是一個(gè)或多個(gè)方法簽名的集合
只要某個(gè)類型擁有該接口所有方法簽名,即算實(shí)現(xiàn)該接口
無(wú)需顯示聲明實(shí)現(xiàn)了哪個(gè)接口慨畸,這稱為Structural Typing
接口只有方法聲明莱坎,沒(méi)有實(shí)現(xiàn),沒(méi)有數(shù)據(jù)字段
接口可以匿名嵌入其他接口寸士,或嵌入結(jié)構(gòu)中
將對(duì)象賦值給接口時(shí)檐什,會(huì)發(fā)生拷貝
而接口內(nèi)部存儲(chǔ)的時(shí)指向這個(gè)復(fù)制品的指針,即無(wú)法修改復(fù)制品的狀態(tài)弱卡,也無(wú)法獲取指針
只有當(dāng)接口存儲(chǔ)的類型和對(duì)象都為nil時(shí)乃正,接口才等于nil
接口調(diào)用不會(huì)做receiver的自動(dòng)轉(zhuǎn)換
接口同樣支持匿名字段方法
接口也可以實(shí)現(xiàn)類似OOP中的多態(tài)
空接口可以作為任何類型數(shù)據(jù)的容器
反射reflection
反射可大大提高程序的靈活性,使得interface{}有更大的發(fā)揮余地
反射使用TypeOf和ValueOf函數(shù)從接口中獲取目標(biāo)對(duì)象信息
反射會(huì)將匿名字段作為獨(dú)立字段(匿名字段本質(zhì))
想要利用反射修改對(duì)象狀態(tài)婶博,前提是interface.data是settable瓮具,即pointer-interface
通過(guò)反射可以“動(dòng)態(tài)”調(diào)用方法