go指针接收器和非指针接收器

家住魔仙堡 提交于 2020-03-06 16:15:25

1.二者的书写方式不同

type student struct {
   age int8
   name string
}
//指针接收器
func(s *student) ageAdd1(){
   s.age+=1
}
//非指针接收器
func(s student) ageAdd2(){
   s.age+=1
}

2.二者传入方法中的对象不同

指针接收器传入的是struct本身,非指针接收器传入的是struct的copy副本

3.二者访问struct的级别不同

指针接收器可以读写struct中的内容,非指针接收器只能读取struct中的数据但是不能写入,如果写入的话也只是写入到struct的备份中而已。

type student struct {
   age int8
   name string
}

func(s *student) ageAdd1(){
   s.age+=1
}

func(s student) ageAdd2(){
   s.age+=1
}

func(s student) ageAdd3() student{
   s.age+=1
   return s
}

func main(){
   student:=new(student)

   student.ageAdd1()
   fmt.Println(student.age)

   student.ageAdd2()
   fmt.Println(student.age)

   student2:=student.ageAdd3()
   fmt.Println(student2.age)
}
/*
结果
1
1
2
*/

ageAdd1和ageAdd2分别是指针接收器和非指针接收器接收的函数,二者对age都进行+1操作后输出的student中的age都是1,由此可见student中的age进行 +1操作只有ageAdd1进行的一次,ageAdd2对age进行+1操作完全没影响student。
ageAdd3给student副本进行+1操作后返回了student的副本student2,由于ageAdd2之前对副本进行过+1操作,所以student2中的age是2。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!