我试图理解指针的行为,并且对此处可以看到的内容感到困惑:
package main
import (
"fmt"
)
type Person struct {
name string
}
type PersonSpecial struct {
name *string
}
func MapPersonToNewPerson(p *Person) *PersonSpecial {
fmt.Printf("Inside Special Person Mapper: %+v\n", &p)
dummy := &PersonSpecial{
name: &p.name,
}
fmt.Printf("Inside Special Person Mapper Lower: %+v\n", dummy)
return dummy
}
func createPerson(name string) Person{
return Person{name: name};
}
func main() {
persons :=[]Person{createPerson("One"), createPerson("Two")}
persons2 :=[]*PersonSpecial{}
for _, person := range persons {
dummy := MapPersonToNewPerson(&person)
fmt.Printf("Inside First Loop: %+v\n", dummy)
persons2 = append(persons2, dummy)
}
for _, person1 := range persons2 {
fmt.Printf("%+v\n", *person1.name)
}
}
Inside Special Person Mapper: 0x1040c130
Inside Special Person Mapper Lower: &{name:0x1040c128}
Inside First Loop: &{name:0x1040c128}
Inside Special Person Mapper: 0x1040c150
Inside Special Person Mapper Lower: &{name:0x1040c128}
Inside First Loop: &{name:0x1040c128}
Two
Two
https://play.golang.org/p/JNSXOoQIbty
为什么我通过引用传递了两个人的相同地址?我在这里做错什么了吗?
答案 0 :(得分:1)
问题在于对以下陈述的误解:
“对于_,人员:=范围人员{”
“人”是“人”类型的变量。在此“ for”语句中,将person [0]的值复制到“ person”变量。实际上,下一个语句“ dummy:= MapPersonToNewPerson(&person)”采用相同变量的指针,并将其两次添加到person2中。
当for循环第二次执行时,内容为“ person”变量将由person [1]更新。
在最后一个“ for”循环中,同一指针的内容被打印两次。 如果在第二个for循环中打印person1.name的指针值,您将看到两个元素的指针值相同。
“ fmt.Printf(”%p,%+ v \ n“,person1.name,* person1.name)”