Go開發工程師
未來3-5年企業高性能項目不可替代的語言,從基礎到項目實戰再到重構,真正從入門到精通
我們在講接口的時候說過,如果一個數據類型所擁有的方法集合中包含了某一個接口類型中的所有方法聲明的實現,那么就可以說這個數據類型實現了那個接口類型。要獲知一個數據類型都包含哪些方法并不難。但是要注意指針方法與值方法的區別。
擁有指針方法Grow
和Move
的指針類型*Person
是接口類型Animal
的實現類型,但是它的基底類型Person
卻不是。這樣的表象隱藏著另一條規則:一個指針類型擁有以它以及以它的基底類型為接收者類型的所有方法,而它的基底類型卻只擁有以它本身為接收者類型的方法。
以上一小節練習題中的類型MyInt
為例,如果Increase
方法是它的指針方法且Decrease
方法是它的值方法,那么*MyInt
類型會擁有這兩個方法,而MyInt
類型僅擁有Decrease
方法。再以Person
類型為例。即使我們把Grow
和Move
都改為值方法,*Person
類型也仍會是Animal
接口的實現類型。另一方面,Grow
和Move
中只要有一個是指針方法,Person
類型就不可能是Animal
接口的實現類型。
另外,還有一點需要大家注意,我們在基底類型的值上仍然可以調用它的指針方法。例如,若我們有一個Person
類型的變量bp
,則調用表達式bp.Grow()
是合法的。這是因為,如果Go語言發現我們調用的Grow
方法是bp
的指針方法,那么它會把該調用表達式視為(&bp).Grow()
。實際上,這時的bp.Grow()
是(&bp).Grow()
的速記法。
在Go語言中,與指針有關的操作實際上還有更多。我們也可以依據這些操作玩兒出很多花樣。不過就一般的Go語言編程而言,目前講述的這些知識已經足夠了。如果大家想深入下去,可以參看Go語言官方文檔和《Go并發編程實戰》中的相關章節。
在源碼文件的第10行處加入若干代碼,使該文件不出現任何編譯錯誤,并且運行該文件會使標準輸出上出現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 }
注意,答案并不唯一。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報