對象就是簡單的一個值或者變量,並且擁有其方法,而方法是某種特定類型的函數。
面向對象編程就是使用方法來描述每個數據結構的屬性和操作。
方法的聲明和函數類似,只是在函數名字前面多了一個參數,這個參數把這個方法綁定到這個參數對應的類型上。
func Distance(p, q Point) float64 {
}
func (p Point) Distance(q Point) float64 {
}
這個參數 p 稱爲方法的接收者。表達式p.Distance稱作選擇子(selector),因爲它爲接收者p選擇合適的Distance方法。
選擇子也用於選擇結構類型中的某些字段值,就像p.X中的字段值。
由於方法和字段來自於同一個命名空間,因此Point結構類型中生命一個叫做X的方法,會與字段X衝突。
每個類型都有一個命名空間。
可以將方法綁定到任何類型上,除了指針類型和接口類型
命名類型(Point)和他們的指針(*Point),是唯一可以出現在接收者生命處的類型。
如果類型T的所有方法的接收者是它自己(T),而不是其指針(*T),那麼複製它就是安全的。調用方法的時候必須進行一次複製。
nil是一個合法的接收者,但必須進行類型轉換。
結構體中,添加匿名結構體,使用方法更方便。
方法變量,它是一個函數,把方法綁定到一個接收者上面。
distanceFromP := p.Distance
distanceFromP(q)
方法表達式,把原來方法的接收者變成函數的第一個參數。
distance := Point.Distance
distance(p, q)
要封裝一個對象,必須使用結構體
Go語言中封裝的單元是包,而不是類型。無論對於函數內的代碼,還是對於方法內的代碼,結構體類型的每個字段,對於同一個包內的代碼都是可見的。