Go指南:方法和介面
阿新 • • 發佈:2021-01-19
方法與指標重定向
帶指標引數的函式必須接受一個指標:
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()
}