go语言方法Value Receiver, Pointer Receiver

  • 情况1 Pointer Receiver
type field struct {
name string
}

func (p *field) print() {
fmt.Printf("%p\n", p)
fmt.Println(p.name)
}

func main() {
data := []field{{"one"}, {"two"}, {"three"}}
//data为对象数组,v为对象类型,print方法参数为指针类型,v调用print方法需要传递其本身的地址
//每次迭代,v本身地址不变,但每次迭代后其内容不同
//所以最终的打印内容是v最后一次迭代的内容
for _, v := range data {
fmt.Printf("%p\n", &v)
go v.print()
}
time.Sleep(3 * time.Second)
}
每次打印的结果都为three

  • 情况2 Pointer Receiver
type field struct {
name string
}

func (p *field) print() {
fmt.Printf("%p\n", p)
fmt.Println(p.name)
}

func main() {
data := []*field{{"one"}, {"two"}, {"three"}}
//data为对象指针数组,v为对象指针类型,print方法参数为指针类型,v调用print方法直接传递v的值即可
//每次迭代,v本身地址不变,但每次迭代后其值(内容)不同
//所以最终的打印内容是v每一次迭代的内容,各不相同
for _, v := range data {
fmt.Printf("%p\n", v)
go v.print()
}
time.Sleep(3 * time.Second)
}
分别打印one,two,three

  • 情况3 Value Receiver
type field struct {
name string
}

func (p field) print() {
fmt.Println(p.name)
}

func main() {
data := []field{{"one"}, {"two"}, {"three"}}
//data为对象数组,v为对象类型,print方法参数为对象类型,v调用print方法需要传递其本身对象的copy
//每次迭代,v本身地址不变,但每次迭代后其内容不同,调用print时copy的内容也不同
//所以最终的打印内容是v每一次迭代的内容
for _, v := range data {
fmt.Printf("%p\n", &v)
go v.print()
}
time.Sleep(3 * time.Second)
}
分别打印one,two,three
  • 情况4 Value Receiver
type field struct {
name string
}

func (p field) print() {
fmt.Println(p.name)
}

func main() {
data := []*field{{"one"}, {"two"}, {"three"}}
//data为对象数组,v为对象指针类型,print方法参数为对象类型,v调用print方法需要传递其指向对象的copy
//每次迭代,v本身地址不变,但每次迭代后其值(内容)不同,指向的结果也不相同,调用print时copy的内容也不同
//所以最终的打印内容是v每一次迭代的内容
for _, v := range data {
fmt.Printf("%p\n", v)
go v.print()
}
time.Sleep(3 * time.Second)
}
分别打印one,two,three

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值