今天開頭就又學了一種新的 function 寫法,該型別專屬的 method,有一點點 class method 的感覺,在 function name 前面指定 receiver (某個型別)。
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
}
receiver 不管是 value or pointer,實際使用時帶入另外一種也成立:
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
v := Vertex{3, 4}
v.Scale(2)
p := &Vertex{4, 3}
p.Scale(3)
不過跟 GPT 討論的時候提到重點:
只有「addressable」的 value 才可以自動轉 pointer。
而 addressable 就是指可以用 "&" 取得位址的值,那什麼東西不能用 & 取址?
&Person{}
func getPerson() Person {
return Person{}
}
&getPerson()
m := map[string]Person{}
&m["a"]
官方也直接提出兩點為何要將 receiver 定成 pointer,第一點顯而易見就是可以更改型別變數的內容,但第二點就比較專業一點了,通常初學者不會想到這塊:
The second is to avoid copying the value on each method call. This can be more efficient if the receiver is a large struct
今天時間比較趕,就先學到這裡了~