在定义结构体的时候,我们可以在上面定义方法。方法的参数可以是值类型的也可以是指针类型的,但是他们有什么区别呢?下面我们来详细聊聊
值类型参数
当你用值类型参数定义方法时,方法会接收调用者的一个副本。就像复制了一份超人的力量给某个普通人,这个普通人用这份复制的力量做事情,不会影响到真正的超人。
// 这里是值类型方法
func (p Person) HaveBirthday() {
p.Age++
}
func main() {
person1 := Person{Name: "Alice", Age: 30}
person1.HaveBirthday()
fmt.Println(person1.Age) // 还是 30,因为改变只影响了副本
}
在这个例子中,HaveBirthday 方法接收 Person 的副本,所以即使方法里 Age 增加了,但对 person1 本身没有影响。
指针型参数
指针型参数的方法接收的是调用者的地址。这就像绿巨人使用他自己的力量,不仅变得更强大,而且会永久改变他的状态。
// 这里是指针类型方法
func (p *Person) HaveBirthday() {
p.Age++
}
func main() {
person1 := Person{Name: "Alice", Age: 30}
person1.HaveBirthday()
fmt.Println(person1.Age) // 现在是 31,因为改变影响了实际对象
}
在这个例子中,HaveBirthday 方法接收 Person 的指针,所以 Age 的改变直接影响了 person1。
什么时候使用哪种方法?
使用值类型方法
- 不需要修改对象:如果你的方法只是读取数据或者执行一些不需要修改对象本身的操作,用值类型。
- 小对象:对于小的结构体,值类型参数在性能和内存使用上没什么大问题。
使用指针型方法
- 需要修改对象:如果你的方法需要改变对象的状态(如更新字段值),使用指针类型。
- 避免拷贝大对象:对于大的结构体,使用指针类型可以避免不必要的内存拷贝,提升性能。