在 Go 语言中,方法可以使用值接收者(value receiver)或指针接收者(pointer receiver)。这两者之间有关键的区别,主要涉及到方法对实例的修改、复制开销和调用时的语法。
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)
}
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)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特