Why when we reference struct using (*structObj)
does Go seem to return a new copy of structObj
rather than return the same address of original structObj
? This might be some misunderstanding of mine, so I seek clarification
package main
import (
"fmt"
)
type me struct {
color string
total int
}
func study() *me {
p := me{}
p.color = "tomato"
fmt.Printf("%p
", &p.color)
return &p
}
func main() {
p := study()
fmt.Printf("&p.color = %p
", &p.color)
obj := *p
fmt.Printf("&obj.color = %p
", &obj.color)
fmt.Printf("obj = %+v
", obj)
p.color = "purple"
fmt.Printf("p.color = %p
", &p.color)
fmt.Printf("p = %+v
", p)
fmt.Printf("obj = %+v
", obj)
obj2 := *p
fmt.Printf("obj2 = %+v
", obj2)
}
Output
0x10434120
&p.color = 0x10434120
&obj.color = 0x10434140 //different than &p.color!
obj = {color:tomato total:0}
p.color = 0x10434120
p = &{color:purple total:0}
obj = {color:tomato total:0}
obj2 = {color:purple total:0} // we get purple now when dereference again
Go playground
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…