方法的声明

方法的声明和普通函数的声明类似,只是在函数名字前面多了一个参数。这个参数把这个方法绑定到这个参数对应的类型上

type dog {
    name string
    attr string
}

func (d dog) Running() {
    fmt.Println(d.name, d.attr)
}

上述代码中(d dog)被称之为接收者,通常的,接收者不使用特殊的名字,而是使用接收者的名字的首字母。

指针接收者的方法

如果一个方法里需要更新接收者里所包含的变量或成员,或者说如果一个实参太大而我们希望避免复制整个实参,这时候我们必须使用指针来传递变量的地址。

命令类型(dog)与指针向的指针(*dog)是唯一可以出现在接收者声明的类型。而且,为了防止混淆,不允许本身是指针的类型进行方法声明

type (d *dog) Rename(name string) {
    d.name = name
    fmt.Println("my name is : ", d.name)
}

type p *int
func (p) f(){}// 编译出错
nil是一个合法的接收者

就像函数允许nil指针作为实参,方法的接收者也一样,尤其是当nil是类型中有意义的零值(例如map,slice类型)时

type Node struct {
    Val int
    Tail *Node
}

func (n *Node) Sum() int {
    if n == nil {
        return 0
    }
    return n.Val + n.Tail.Sum()
}

that's all

results matching ""

    No results matching ""