09. Go极简教程 结构体的函数扩展

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/

Go极简教程 继续阅读( 目录)

你可能感兴趣的:(09. Go极简教程 结构体的函数扩展)