- 情况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