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()
}