go语言方法Value Receiver, Pointer Receiver

来源:互联网 发布:qq三国79js单刷孟获 编辑:程序博客网 时间:2024/06/08 12:59
  • 情况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

0 0