1. 程式人生 > >【高階資料型別2】- 12. 指標(續

【高階資料型別2】- 12. 指標(續

Go語言-指標(續)

    我們在講介面的時候說過,如果一個數據型別所擁有的方法集合中包含了某一個介面型別中的所有方法宣告的實現,那麼就可以說這個資料型別實現了那個介面型別。要獲知一個數據型別都包含哪些方法並不難。但是要注意指標方法與值方法的區別。
  
    擁有指標方法GrowMove的指標型別*Person是介面型別Animal的實現型別,但是它的基底型別Person卻不是。這樣的表象隱藏著另一條規則:一個指標型別擁有以它以及以它的基底型別為接收者型別的所有方法,而它的基底型別卻只擁有以它本身為接收者型別的方法。
  
    以上一小節練習題中的型別MyInt

為例,如果Increase方法是它的指標方法且Decrease方法是它的值方法,那麼*MyInt型別會擁有這兩個方法,而MyInt型別僅擁有Decrease方法。再以Person型別為例。即使我們把GrowMove都改為值方法,*Person型別也仍會是Animal介面的實現型別。另一方面,GrowMove中只要有一個是指標方法,Person型別就不可能是Animal介面的實現型別。
  
    另外,還有一點需要大家注意,我們在基底型別的值上仍然可以呼叫它的指標方法。例如,若我們有一個Person型別的變數bp,則呼叫表示式bp.Grow()是合法的。這是因為,如果Go語言發現我們呼叫的Grow
方法是bp的指標方法,那麼它會把該呼叫表示式視為(&bp).Grow()。實際上,這時的bp.Grow()(&bp).Grow()的速記法。
  
    在Go語言中,與指標有關的操作實際上還有更多。我們也可以依據這些操作玩兒出很多花樣。不過就一般的Go語言程式設計而言,目前講述的這些知識已經足夠了。如果大家想深入下去,可以參看Go語言官方文件和《Go併發程式設計實戰》