【高階資料型別2】- 12. 指標(續
阿新 • • 發佈:2019-04-14
Go語言-指標(續)
我們在講介面的時候說過,如果一個數據型別所擁有的方法集合中包含了某一個介面型別中的所有方法宣告的實現,那麼就可以說這個資料型別實現了那個介面型別。要獲知一個數據型別都包含哪些方法並不難。但是要注意指標方法與值方法的區別。
擁有指標方法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併發程式設計實戰》