Se si dichiara o si assegna una variabile di type bar
, si riserva e si inizializza a zero memoria per rd uint8
e foo foo_
. C'è sempre una variabile di type foo_
incorporata in una variabile di type bar
.
var b bar // declare b
Se si dichiara o allocare una variabile di type barP
, le prenotazioni e inizializzare la memoria zero per entrambi rd uint8
e foo *foo_
. Un puntatore a valore zero è un puntatore nil
. Nessuna variabile di type foo_
è allocata; devi farlo separatamente. Vi è uno zero (foo == nil
) o una variabile di type foo_
indicata da una variabile di type barP
. Una variabile di type barP
può puntare alla stessa variabile di type foo_
come altre variabili di type barP
, condividendo la stessa copia della variabile di type foo_
. Una modifica a una copia condivisa è vista da tutte le variabili che puntano ad essa.
var bp barP // declare bp
bp.foo = new(foo_) // allocate bp.foo
quale usare dipende dalle proprietà dei type bar
contro type barP
. Quale tipo riflette più da vicino il problema che stai cercando di risolvere?
Ad esempio, considerare questo problema di fatturazione. Abbiamo sempre un indirizzo di fatturazione; chiederemo sempre i nostri soldi Tuttavia, spesso spediamo all'indirizzo di fatturazione, ma non sempre. Se l'indirizzo di spedizione è nil
, utilizzare l'indirizzo di fatturazione. Altrimenti, utilizzare un indirizzo di spedizione separato. Abbiamo due magazzini e spediamo sempre da uno o dall'altro. Possiamo condividere le due posizioni di magazzino. Poiché non inviamo una fattura fino a quando l'ordine non viene spedito dal magazzino, la posizione di magazzino non sarà mai nil
.
type address struct {
street string
city string
}
type warehouse struct {
address string
}
type invoice struct {
name string
billing address
shipping *address
warehouse *warehouse
}
Quando una variabile di tipo barP' è dichiarata o allocata, il valore iniziale di foo sarà un puntatore 'nil'. – peterSO