本文正在参加「金石方案」

本文首发于稀土,转载请联络授权

作者:陈明勇

公众号:Go技术干货

前语

许多 Go 初学者在办法接纳器的挑选上或许会感到困惑,不知道该挑选值接纳器仍是指针接纳器。本文将会对办法接纳器进行介绍,并给出怎么挑选正确办法接纳器的辅导建议。

Go 方法接收器:选择值接收器还是指针接收器?

办法接纳器

Go 语言中,办法接纳器是指在函数名前的参数,它作为办法的接纳者,也便是该办法所属的类型。办法接纳器能够是一个值类型(如 struct 或自界说类型),也能够是指向一个值类型的指针类型。

值接纳器

值接纳器是将类型的值作为办法接纳器。

假设咱们有一个结构体类型 Person

type Person struct {
   Name string
   Age  int
}

咱们可认为 Person 结构体界说一个 SayHello 的办法:

func (p Person) SayHello() {
   fmt.Println("你好,我是陈明勇,请多指教!")
}

在这个办法的界说中,咱们运用了一个值类型的接纳器 (p Person)。这意味着任何 Person 类型的值或指针都能够调用 SayHello 办法,例如:

p := Person{Name: "陈明勇", Age: 23}
p.SayHello()
p2 := &Person{Name: "陈明勇", Age: 23}
p2.SayHello()

指针接纳器

指针接纳器是将类型的指针作为办法接纳器。

接着值接纳器的代码比如,咱们可认为 Person 结构体界说一个 SetName(name string) 办法:

func (p *Person) SetName(name string) {
   p.Name = name
}

在这个办法的界说中,咱们运用了一个指针类型的接纳器 (p *Person)。这意味着任何 Person 类型的指针都能够调用 SetName 办法,例如:

p := Person{Name: "陈明勇", Age: 23}
p.SetName("Chen Mingyong")
fmt.Println(p)
p2 := &Person{Name: "陈明勇", Age: 23}
p2.SetName("Chen Mingyong")
fmt.Println(p2)

值接纳器与指针接纳器的比较

值接纳器

  1. 当运用值接纳器时,办法内部对接纳器的修正不会影响到原始值。
  2. 指接纳器能够接纳类型的值和指针,假如是指针,在办法内部会被转为值。

指针接纳器

  1. 当运用指针接纳器时,办法内部对接纳器的修正会影响到原始值。
  2. 指接纳器能够接纳类型的值和指针,假如是值,在办法内部会被转为指针。

怎么挑选正确的办法接纳器

挑选原则

在挑选办法接纳器时,咱们需求考虑以下几个因素:

  1. 修正原始值的需求:假如办法需求修正接纳器的值,那么应该运用 指针接纳器。由于值接纳器会创立原始值的副本,在办法内部对其进行的修正 不会 影响原始值。
  2. 数据结构大小:关于大型数据结构,运用 指针接纳器 能够防止数据仿制带来的功能开支。而关于较小的数据结构,运用 值接纳器 或许不会带来明显的功能影响。
  3. 一致性:在同一个类型中,尽量坚持 一致性,防止混用值接纳器和指针接纳器。这将有助于进步代码的可读性和可维护性。
  4. 安全性:值接纳器不会修正原始值,因此在某些情况下或许更安全。假如需求 保护 原始数据不被意外修正,能够考虑运用 值接纳器

实践开发中的一些建议

  1. 在实践开发中,尽量坚持 一致性,防止在同一个类型中混用值接纳器和指针接纳器。
  2. 假如依然 无法确认 运用哪种接纳器,建议运用 指针接纳器,由于它能够防止数据仿制带来的功能开支。

小结

本文简略介绍了 Go 语言中的办法接纳器,要点讲解了值接纳器和指针接纳器。经过实践示例展现了它们的用法,并对比了它们的差异性。最后,给出了怎么依据实践情况正确挑选接纳器的建议。

总之,在挑选接纳器时,咱们应考虑接纳器类型的特性及运用场景,依据实践需求做出挑选。若 无法确认 终究运用哪种接纳器,建议优先考虑 指针接纳器

Go 方法接收器:选择值接收器还是指针接收器?