Go 没有类。然而,仍然可以在结构体类型上定义方法。
结构体的函数扩展可以帮助我们实现类似面向对象的"类的封装"
给结构体扩展方法
package main
import (
"log"
)
// Vertex -
type Vertex struct {
X, Y float64
}
// Scale - 正确的例子
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
// Small - 错误的例子
func (v Vertex) Small(f float64) {
v.X = v.X / f
v.Y = v.Y / f
}
func main() {
// Scale 使用了 *Vertex 指针, 避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率
// 其次,方法可以修改接收者指向的值
v1 := &Vertex{3, 4}
v1.Scale(5)
log.Println(*v1) // {15 20}
// Small 方法没有使用指针, 函数里头的v是拷贝值, 每次修改的都是新的拷贝值, 所以v2没有被修改
v2 := Vertex{3, 4}
v2.Small(2)
log.Println(v2) // {3, 4}
}
参考资料:
http://go-tour-zh.appspot.com/
网友评论