Go指南:方法和接口
方法與指針重定向
帶指針參數(shù)的函數(shù)必須接受一個(gè)指針:
func ScaleFunc(v *Vertex, f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
以指針為接收者的方法被調(diào)用時(shí),接收者既能為值又能為指針:
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
對(duì)于語(yǔ)句 v.Scale(5),即便 v 是個(gè)值而非指針,帶指針接收者的方法也能被直接調(diào)用。
Go 會(huì)將語(yǔ)句 v.Scale(5) 解釋為 (&v).Scale(5)
使用指針接收者的原因:
方法能夠修改其接收者指向的值
可以避免在每次調(diào)用方法時(shí)復(fù)制該值。若值的類型為大型結(jié)構(gòu)體時(shí),這樣做會(huì)更加高效。
接口
接口類型 是由一組方法簽名定義的集合。接口類型的變量可以保存任何實(shí)現(xiàn)了這些方法的值。
接口與隱式實(shí)現(xiàn)
類型通過(guò)實(shí)現(xiàn)一個(gè)接口的所有方法來(lái)實(shí)現(xiàn)該接口
type I interface {
M()
}
type T struct {
S string
}
// 此方法表示類型 T 實(shí)現(xiàn)了接口 I,但我們無(wú)需顯式聲明此事。
func (t T) M() {
fmt.Println(t.S)
}
func main() {
var i I = T{"hello"}
i.M()
}

浙公網(wǎng)安備 33010602011771號(hào)