结构体方法

结构体方法就是附加给结构体的函数。

package main

import (
	"fmt"
)

type User struct {
	name string
}

func (u User) Name() string {
	return u.name
}

func (u *User) SetName(newName string) {
	u.name = newName
}

func main() {
	var me User

	me.SetName("Slim Shady")
	fmt.Println("My name is", me.Name())
}

为结构体定义方法,跟定义一个函数的唯一区别就是在func关键字和函数名之间增加了方法接受者(receiver),如上例中的(u *User)

方法接受者可以被声明为类型的实例或者是类型的实例的指针。

上例中,因为SetName()会修改实例的属性值,所以需要传递指针,以实现永久修改。

译者注

一般的,为结构体添加方法时,总是推荐传递实例的指针而非实例。

其一是因为Go语言总是值传递,会新增一份拷贝,从而多占内存;其二是我们往往需要修改实例的属性值,而不仅仅是读取它。

当然,推荐做法并非一成不变的教条,如果某种时候传递实例(需要一份拷贝)是更好的选择,那么应该打破这些“经验之谈”。

译者注

关于上述提示中提到的“Go语言总是值传递”可能有人不解(不服),请自己动手多做观察,或者复习结构体复制一节。可以发现,即便是引用类型的传递,也是复制了第一级指针所指向的值(指针值),而非直接传递原指针。

最后更新于