1. 程式人生 > 實用技巧 >Go指南:方法和介面

Go指南:方法和介面

方法與指標重定向

帶指標引數的函式必須接受一個指標:

func ScaleFunc(v *Vertex, f float64) {
v.X = v.X * f
v.Y = v.Y * f
}

以指標為接收者的方法被呼叫時,接收者既能為值又能為指標:

func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}

對於語句v.Scale(5),即便v個值而非指標,帶指標接收者的方法也能被直接呼叫。

Go 會將語句v.Scale(5)解釋為(&v).Scale(5)

使用指標接收者的原因:

方法能夠修改其接收者指向的值

可以避免在每次呼叫方法時複製該值。若值的型別為大型結構體時,這樣做會更加高效。


介面

介面型別是由一組方法簽名定義的集合。介面型別的變數可以儲存任何實現了這些方法的值。

介面與隱式實現

型別通過實現一個介面的所有方法來實現該介面

type I interface {
M()
}

type T struct {
S string
}

// 此方法表示型別 T 實現了介面 I,但我們無需顯式宣告此事。
func (t T) M() {
fmt.Println(t.S)
}

func main() {
var i I = T{"hello"}
i.M()
}