Go语言方法可以接收值类型或指针类型参数,这直接影响方法的行为。本文将通过Person结构体及其Eat()方法的两种接收器类型(Person和*Person)来阐述其差异。
代码中定义的Person结构体包含姓名、年龄、性别和爱好等字段,以及两个同名Eat()方法,分别使用值接收器和指针接收器。接收器类型决定了方法调用时的参数传递方式,进而影响方法内部对结构体属性的修改。
james.Eat()的调用方式决定了哪个Eat()方法会被执行。由于james是Person类型的变量(值类型),编译器会选择接收器为Person的方法。如果james声明为指针类型(james := &Person{}),则会调用接收器为*Person的方法。
立即学习“go语言免费学习笔记(深入)”;
关键区别在于:值接收器(Person)传递的是结构体的副本;指针接收器(*Person)传递的是结构体的指针。因此,使用值接收器时,方法内部对结构体属性的修改不会影响原始变量james;而使用指针接收器时,修改会直接作用于james。
总结:
- 值接收器和指针接收器拥有不同的方法集(虽然方法名相同,但接收器类型不同,视为不同的方法)。
- 值接收器传递的是副本,修改不影响原变量;指针接收器传递的是指针,修改直接影响原变量。
理解这两种接收器类型的差异,有助于开发者根据需求选择合适的接收器类型,灵活控制结构体状态。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐