標籤:actor factor IV class 關鍵字 聲明 結構體 指標方法 種類
一、方法
在函式宣告時,在其名字之前放上一個變數,即是一個方法。這個附加的參數會將該函數附加到這種類型上,即相當於為這種類型定義了一個獨佔的方法。如:
package geometryimport "math"type Point struct{ X, Y float64 }// traditional functionfunc Distance(p, q Point) float64 { return math.Hypot(q.X-p.X, q.Y-p.Y)}// same thing, but as a method of the Point typefunc (p Point) Distance(q Point) float64 { return math.Hypot(q.X-p.X, q.Y-p.Y)}p := Point{1, 2}q := Point{4, 6}fmt.Println(Distance(p, q)) // "5", function callfmt.Println(p.Distance(q)) // "5", method call
上方代碼裡附加的參數p,叫做方法的接收器(receiver)。Go語言中不像其它語言使用this或self作為接收器,我們可以任意選擇接收器的名字。為保持其在方法間傳遞時的一致性和簡短性,建議使用其類型的第一字母。
當接收器變數本身比較大時(拷貝消耗資源較多),我們可以用其指標而不是對象來聲明方法。如:
func (p *Point) ScaleBy(factor float64) { p.X *= factor p.Y *= factor}p := Point{1, 2}(&p).ScaleBy(2)fmt.Println(p) // "{2, 4}"
如果接收器p是一個Point類型的變數,並且其方法需要一個Point指標作為接收器,我們可以簡寫為p.ScaleBy(2)。編譯器會隱式的幫我們用&p去調用ScaleBy這個方法。
這種簡寫只適用於"變數",不能通過一個無法取得地址的接收器來調用指標方法,如:Point{1,2}.scaleBy(2)。
GO語言中沒有類似C++的Class關鍵字,以及直接的對象繼承。不過可以通過嵌入結構體來擴充類型,在類型中內嵌的匿名欄位也可以是一個命名類型的指標。如下:
type ColoredPoint struct { *Point color.RGBA}
待續
Go語言的物件導向(OOP)