Go中的方法与接收器

3,853 阅读1分钟
  • 作用:为了将函数与结构体绑定,类似于OOP中的对象与方法。

  • 格式

func (接收器变量 接收器类型) 方法名(参数列表) (返回参数){ //函数体 }

  • 接收器类型
    • 指针接收器:指针类型的接收器由一个结构体的指针组成,更接近于面向对象中的this,由于指针的特性,调用方法时,修改接收器指针的任意成员变量,在方法结束后,修改都是有效的。
    • 非指针接收器:Go语言会在代码运行时将接收器的值复制一份。在非指针接收器的方法中可以获取接收器的成员值,但修改后无效。
  • 如何选择
    • 可参考《Go语言实战》5.3节,核心思想就是,不能只通过是否修改值来决定使用指针接受者还是值接受者,而要去关注类型的本质,成员是内置类型(int,float...),引用类型(map,slice...)使值接受者,成员是结构类型使用指针接受者。但也是根据具体需而定。
  • 推荐使用指针接受者
    • 方法能够修改接收者指向的值。
    • 避免在每次调用方法时复制该值,在值的类型为大型结构体时,这样做会更加高效。
  • 测试
type Cat struct {
	Name string
	Age  int
}
func (c Cat) changeName1() {
	c.Name = "酷黑猫"
	fmt.Println("changeName1 中修改后:", c)
}
func (c *Cat) changeName2() {
	c.Name = "大花猫"
	fmt.Println("changeName2 中修改后:", c)
}
func main() {
	var fan = Cat{Name: "小番茄", Age: 20}
	fmt.Println("changeName1 之前:", fan)
	fan.changeName1()
	fmt.Println("changeName1 之后:", fan)
	fmt.Println(".....................")
	fmt.Println("changeName2 之前:", fan)
	fan.changeName2()
	fmt.Println("changeName2 之后:", fan)
}