Dlaczego, kiedy odwołujemy się do struct używając (* structObj), golang wydaje się zwracać nową kopię structObj niż zwracać ten sam adres oryginalnego structObj? Może być trochę nie rozumieją mój na ten temat, więc szukać rodzaju wyjaśnieńjest dereference 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)
}
Wyjście
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
Czy istnieje sposób, aby uzyskać ten sam wskaźnik dereferencji do p? jak w func main(), jeśli dodajemy strukturę jako plaster, zawsze będziemy musieli usunąć ją z wewnątrz samego dopełnienia, tj. res = append (res, * p). – ken
Nie chodzi tylko o "tworzenie" nowej zmiennej, przypisanie do istniejącej zmiennej poprzez dereferencję kopiuje wartość, np. '* a = * b' nadal kopiuje kopie' * b' na '* a'. – JimB
@jimB yap, czy istnieje sposób na uniknięcie powtarzania kopii? ponieważ w zasadzie operacja po prostu musi zajmować się tym samym p struct. – ken