指针的行为

时间:2018-08-16 04:42:17

标签: go

我试图理解指针的行为,并且对此处可以看到的内容感到困惑:

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

为什么我通过引用传递了两个人的相同地址?我在这里做错什么了吗?

1 个答案:

答案 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)”