Wenn Sie eine Variable type bar
deklarieren oder zuweisen, reservieren und initialisieren Sie für rd uint8
und foo foo_
den Speicher null. Es gibt immer eine Variable type foo_
eingebettet in eine Variable type bar
.
var b bar // declare b
Wenn Sie eine Variable von type barP
deklarieren oder zuordnen, können Sie auf Null Speicher sowohl reservieren und initialisieren für rd uint8
und foo *foo_
. Ein Nullwertzeiger ist ein nil
Zeiger. Keine Variable type foo_
ist zugewiesen; Sie müssen das separat machen. Es gibt entweder Null (foo == nil
) oder eine Variable von type foo_
, auf die eine Variable von type barP
zeigt. Eine Variable von type barP
kann auf dieselbe Variable wie type foo_
als andere Variablen von type barP
zeigen, die dieselbe Kopie der Variablen type foo_
teilen. Eine Änderung an einer gemeinsamen Kopie wird von allen Variablen erkannt, die auf sie zeigen.
var bp barP // declare bp
bp.foo = new(foo_) // allocate bp.foo
Welches, hängt im Vergleich zu type barP
auf die Eigenschaften von type bar
zu verwenden. Welcher Typ spiegelt das Problem, das Sie lösen möchten, näher wider?
Betrachten Sie beispielsweise dieses Rechnungsproblem. Wir haben immer eine Rechnungsadresse; Wir werden immer nach unserem Geld fragen. Wir liefern jedoch oft an die Rechnungsadresse, aber nicht immer. Wenn die Lieferadresse nil
lautet, verwenden Sie die Rechnungsadresse. Andernfalls verwenden Sie eine separate Lieferadresse. Wir haben zwei Lagerhäuser, und wir versenden immer von dem einen oder dem anderen. Wir können die zwei Lagerstandorte teilen. Da wir keine Rechnung senden, bis die Bestellung vom Lager versandt wird, wird der Lagerort niemals sein.
type address struct {
street string
city string
}
type warehouse struct {
address string
}
type invoice struct {
name string
billing address
shipping *address
warehouse *warehouse
}
Wenn eine Variable vom Typ "barP" deklariert oder zugewiesen wird, ist der Anfangswert von foo ein "nil" -Zeiger. – peterSO