Go開發(fā)工程師
未來3-5年企業(yè)高性能項(xiàng)目不可替代的語言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通
我們?cè)谥v接口的時(shí)候說過,如果一個(gè)數(shù)據(jù)類型所擁有的方法集合中包含了某一個(gè)接口類型中的所有方法聲明的實(shí)現(xiàn),那么就可以說這個(gè)數(shù)據(jù)類型實(shí)現(xiàn)了那個(gè)接口類型。要獲知一個(gè)數(shù)據(jù)類型都包含哪些方法并不難。但是要注意指針方法與值方法的區(qū)別。
擁有指針方法Grow
和Move
的指針類型*Person
是接口類型Animal
的實(shí)現(xiàn)類型,但是它的基底類型Person
卻不是。這樣的表象隱藏著另一條規(guī)則:一個(gè)指針類型擁有以它以及以它的基底類型為接收者類型的所有方法,而它的基底類型卻只擁有以它本身為接收者類型的方法。
以上一小節(jié)練習(xí)題中的類型MyInt
為例,如果Increase
方法是它的指針方法且Decrease
方法是它的值方法,那么*MyInt
類型會(huì)擁有這兩個(gè)方法,而MyInt
類型僅擁有Decrease
方法。再以Person
類型為例。即使我們把Grow
和Move
都改為值方法,*Person
類型也仍會(huì)是Animal
接口的實(shí)現(xiàn)類型。另一方面,Grow
和Move
中只要有一個(gè)是指針方法,Person
類型就不可能是Animal
接口的實(shí)現(xiàn)類型。
另外,還有一點(diǎn)需要大家注意,我們?cè)诨最愋偷闹瞪先匀豢梢哉{(diào)用它的指針方法。例如,若我們有一個(gè)Person
類型的變量bp
,則調(diào)用表達(dá)式bp.Grow()
是合法的。這是因?yàn)?,如果Go語言發(fā)現(xiàn)我們調(diào)用的Grow
方法是bp
的指針方法,那么它會(huì)把該調(diào)用表達(dá)式視為(&bp).Grow()
。實(shí)際上,這時(shí)的bp.Grow()
是(&bp).Grow()
的速記法。
在Go語言中,與指針有關(guān)的操作實(shí)際上還有更多。我們也可以依據(jù)這些操作玩兒出很多花樣。不過就一般的Go語言編程而言,目前講述的這些知識(shí)已經(jīng)足夠了。如果大家想深入下去,可以參看Go語言官方文檔和《Go并發(fā)編程實(shí)戰(zhàn)》中的相關(guān)章節(jié)。
在源碼文件的第10行處加入若干代碼,使該文件不出現(xiàn)任何編譯錯(cuò)誤,并且運(yùn)行該文件會(huì)使標(biāo)準(zhǔn)輸出上出現(xiàn)true, true
。
在該文件第10行添加的代碼可以是:
type Dog struct { name string age uint8 } func (dog Dog) Name() string { return dog.name } func (dog Dog) Age() uint8 { return dog.age }
注意,答案并不唯一。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)