咱們在講接口的時候說過,若是一個數據類型所擁有的方法集合中包含了某一個接口類型中的全部方法聲明的實現,那麼就能夠說這個數據類型實現了那個接口類型。要獲知一個數據類型都包含哪些方法並不難。可是要注意指針方法與值方法的區別。
擁有指針方法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併發編程實戰》中的相關章節。編程