Perché quando facciamo riferimento a struct usando (* structObj), golang sembra restituire una nuova copia di structObj che restituisca lo stesso indirizzo di structObj originale? Potrebbe essere un po 'fraintendere mio su questo, quindi cercare tipo chiarimentiis 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)
}
uscita
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
c'è un modo per ottenere lo stesso puntatore dereferenziato a p? come nella funzione main(), se stiamo aggiungendo la struct come slice, dovremo sempre dereferenziarla all'interno dell'append, cioè res = append (res, * p). – ken
Non si tratta solo di "creare" una nuova variabile, l'assegnazione ad una variabile esistente tramite una dereferenziatura copia il valore, ad es. '* a = * b' copia ancora copia' * b' a '* a'. – JimB
@jimB yap, c'è un modo per evitare la copia ripetuta? in pratica l'operazione ha solo bisogno di occuparsi della stessa struttura. – ken