Почему, когда мы ссылаемся на struct using (* structObj), golang, похоже, возвращает новую копию structObj, чем возвращает тот же адрес исходного structObj? Может быть какой-то неправильно понять мой на это, так что искать любезное разъяснение- это разыменование golang struct return new copy of struct?
package main
import (
"fmt"
)
type me struct {
color string
total int
}
func study() *me {
p := me{}
p.color = "tomato"
fmt.Printf("%p\n", &p.color)
return &p
}
func main() {
p := study()
fmt.Printf("&p.color = %p\n", &p.color)
obj := *p
fmt.Printf("&obj.color = %p\n", &obj.color)
fmt.Printf("obj = %+v\n", obj)
p.color = "purple"
fmt.Printf("p.color = %p\n", &p.color)
fmt.Printf("p = %+v\n", p)
fmt.Printf("obj = %+v\n", obj)
obj2 := *p
fmt.Printf("obj2 = %+v\n", obj2)
}
Выход
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
Есть ли способ получить такой же разыменованный указатель на p? как и в main() func, если мы добавляем структуру как срез, нам всегда придется разыгрывать ее внутри самого append, то есть res = append (res, * p). – ken
Это не просто «создание» новой переменной, а назначение существующей переменной посредством разыменования копирует значение, например. '* a = * b' все еще копирует копии' * b' в '* a'. – JimB
@jimB yap, есть ли способ избежать повторной копии? так как в основном операция просто должна иметь дело с одной и той же структурой p. – ken