這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
method的文法如下:
func (r ReceiverType) funcName(parameters) (results)
下面我們用最開始的例子用method來實現:
package mainimport ( "fmt" "math")type Rectangle struct { width, height float64}type Circle struct { radius float64}func (r Rectangle) area() float64 { return r.width*r.height}func (c Circle) area() float64 { return c.radius * c.radius * math.Pi}func main() { r1 := Rectangle{12, 2} r2 := Rectangle{9, 4} c1 := Circle{10} c2 := Circle{25} fmt.Println("Area of r1 is: ", r1.area()) fmt.Println("Area of r2 is: ", r2.area()) fmt.Println("Area of c1 is: ", c1.area()) fmt.Println("Area of c2 is: ", c2.area())}
在使用method的時候重要注意幾點
- 雖然method的名字一模一樣,但是如果接收者不一樣,那麼method就不一樣
- method裡面可以訪問接收者的欄位
- 調用method通過
.
訪問,就像struct裡面訪問欄位一樣
圖示如下:
圖2.9 不同struct的method不同
在上例,method area() 分別屬於Rectangle和Circle, 於是他們的 Receiver 就變成了Rectangle 和 Circle, 或者說,這個area()方法 是由 Rectangle/Circle 發出的。
值得說明的一點是,圖示中method用虛線標出,意思是此處方法的Receiver是以值傳遞,而非引用傳遞,是的,Receiver還可以是指標, 兩者的差別在於, 指標作為Receiver會對執行個體對象的內容發生操作,而普通類型作為Receiver僅僅是以副本作為操作對象,並不對原執行個體對象發生操作。後文對此會有詳細論述。
那是不是method只能作用在struct上面呢?當然不是咯,他可以定義在任何你自訂的類型、內建類型、struct等各種類型上面。這裡你是不是有點迷糊了,什麼叫自訂類型,自訂類型不就是struct嘛,不是這樣的哦,struct只是自訂類型裡面一種比較特殊的類型而已,還有其他自訂類型申明,可以通過如下這樣的申明來實現。
type typeName typeLiteral
請看下面這個申明自訂類型的代碼
type ages inttype money float32type months map[string]intm := months { "January":31, "February":28, ... "December":31,}