Method
Golang 中没有类的概念,只有结构体。
定义函数时,如果指定了一个receiver
,则这个函数会被绑定到receiver
上,这个receiver
必须是一个local type
,也就是使用type
关键字定义的类型。
定义
基本类型方法
type MyInt int
func (v MyInt) Abs() MyInt {
if v > 0 {
return v
} else {
return -v
}
}
结构体类型方法
type MyPos struct {
x float64
y float64
}
func (myPos MyPos) Abs() float64 {
return math.Sqrt(myPos.x*myPos.x + myPos.y*myPos.y)
}
什么时候receiver
应该是指针,什么时候应该是局部变量?
- 当你需要对原始数据做修改时,
receiver
应该使用指针。 - 当一个变量的copy代价非常大的时候,避免每次
method call
都要复制变量。
eg:平面直角系的坐标点
type Point struct {
x float64
y float64
disCache float64
}
func (point Point) Dis() float64 {
return math.Sqrt(point.x*point.x + point.y*point.y)
}
func (point *Point) DisCache() float64 {
if point.disCache != 0 {
fmt.Println("Get From Cache")
return point.disCache
}
point.disCache = point.Dis()
return point.disCache
}
其中point.disCache = point.Dis()
调用的问题可以查看这个问题