在 Go 语言中,方法可以使用值接收者(value receiver)或指针接收者(pointer receiver)。这两者之间有关键的区别,主要涉及到方法对实例的修改、复制开销和调用时的语法。
值接收者(Value Receiver)
1.定义方式:•使用值接收者的方法是在方法的接收者参数中使用实例的值。•方法的调用会创建接收者实例的副本,方法在这个副本上进行操作,不影响原始实例。2.适用场景: 当方法不需要修改实例的状态时,或者实例是小的不可变对象时,可以使用值接收者。3.示例:
代码语言:javascript复制package main
import "fmt"
type Point struct {
X, Y int
}
// 方法使用值接收者
func (p Point) Move(dx, dy int) {
p.X = dx
p.Y = dy
}
func main() {
point := Point{X: 1, Y: 2}
fmt.Println("Before Move:", point)
// 调用方法,不影响原始实例
point.Move(2, 3)
fmt.Println("After Move:", point)
}
指针接收者(Pointer Receiver)
1.定义方式:•使用指针接收者的方法是在方法的接收者参数中使用实例的指针。•方法的调用直接操作实例,可以修改实例的状态。2.适用场景: 当方法需要修改实例的状态时,或者实例是大的可变对象时,可以使用指针接收者。3.示例:
代码语言:javascript复制package main
import "fmt"
type Point struct {
X, Y int
}
// 方法使用指针接收者
func (p *Point) Move(dx, dy int) {
p.X = dx
p.Y = dy
}
func main() {
point := &Point{X: 1, Y: 2}
fmt.Println("Before Move:", *point)
// 调用方法,直接修改原始实例
point.Move(2, 3)
fmt.Println("After Move:", *point)
}
注意事项
•使用值接收者时,方法对于实例的修改不会影响原始实例。•使用指针接收者时,方法对于实例的修改会直接影响原始实例。•在设计方法时,需要根据具体的需求和语义选择合适的接收者类型。
总体而言,选择值接收者还是指针接收者取决于方法对于实例的修改需求。如果方法需要修改实例的状态,或者实例是大的可变对象,通常使用指针接收者。如果方法不需要修改实例的状态,且实例是小的不可变对象,可以使用值接收者。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5] 腾讯云开发者社区:孟斯特[6]
References
[1]
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
[2]
mengbin: mengbin1992@outlook.com
[3]
mengbin: https://mengbin.top
[4]
mengbin92: https://mengbin92.github.io/
[5]
恋水无意: https://www.cnblogs.com/lianshuiwuyi/
[6]
孟斯特: https://cloud.tencent.com/developer/user/6649301