指针的行为

I am trying to understand the behavior of pointers and I am confused with what can be observed here:

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
", &p)
    dummy := &PersonSpecial{
        name: &p.name,
    }
    fmt.Printf("Inside Special Person Mapper Lower: %+v
", 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
", dummy)
        persons2 = append(persons2, dummy)

    }
    for _, person1 := range persons2 {
        fmt.Printf("%+v
", *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

Why am I getting the same address for both persons although I am passing them by reference? Am I doing something wrong here?

The issue is with the misunderstanding of this statement:

"for _, person := range persons {"

"person" is variable of type Person. In this 'for' statement value of persons[0] is copied to "person" variable. Effectively the next statement, "dummy := MapPersonToNewPerson(&person)", takes the pointer of same variable and adding it twice in to persons2.

When the for loop executes for the second time, the content is "person" variable is updated with persons[1].

Son the last 'for' loop, the content of the same pointer is printed twice. If you print the pointer value of person1.name in second for loop, you will see the pointer values are same for both the elements.

"fmt.Printf("%p, %+v ", person1.name, *person1.name)"