GoLang NoteBook Methods And InterFace

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应该是指针,什么时候应该是局部变量?

  1. 当你需要对原始数据做修改时,receiver应该使用指针。
  2. 当一个变量的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()调用的问题可以查看这个问题

你可能感兴趣的:(GoLang NoteBook Methods And InterFace)