Ich versuche, in a := b
um herauszufinden, ob a
eine andere Kopie von structWarum haben alle verschachtelten Strukturobjekte beim Ausdruck dieselbe Adresse?
wie func pass_by_value(a some_struct)
sein wird, aber ich finde, dass ich die print-Anweisung nicht verstehen.
Betrachten Sie diese go playground
nested_level2 := test_assign_nested_level2{}
nested_level1 := test_assign_nested{nested_level2}
top_level := test_assign{nested_level1}
assign := top_level
fmt.Println("top_level address")
fmt.Printf("%p", &top_level)
fmt.Println(" ")
fmt.Println("1 level address")
fmt.Printf("%p", &top_level.Level1)
fmt.Println(" ")
fmt.Println("2 level address")
fmt.Printf("%p", &top_level.Level1.Level_2)
fmt.Println("------------------------")
fmt.Println("assign top_level address")
fmt.Printf("%p", &assign)
fmt.Println(" ")
fmt.Println("1 level address")
fmt.Printf("%p", &assign.Level1)
fmt.Println(" ")
fmt.Println("2 level address")
fmt.Printf("%p", &assign.Level1.Level_2)
Der Ausgang des oben
isttop_level address
0x10410020
1 level address
0x10410020
2 level address
0x10410020
assign top_level address
0x10410024
1 level address
0x10410024
2 level address
0x10410024
ich die Ausgabe erwarten ähnlich sein
fmt.Println("top_level address")
fmt.Printf("%p", &top_level)
fmt.Println(" ")
fmt.Println("1 level address")
fmt.Printf("%p", &nested_level1)
fmt.Println(" ")
fmt.Println("2 level address")
fmt.Printf("%p", &nested_level2)
fmt.Println(" ")
fmt.Println(" ------------------------------- ")
wo
top_level address
0x421152280
1 level address
0x421152270
2 level address
0x421152260
Jede Struktur hat eine andere Adresse. aber es scheint, dass die Child-Struktur die gleiche Adresse wie die Eltern-Struktur hat.
Warum hat das gesamte verschachtelte Element in der Struktur die gleiche Adresse?
Und kopiert tatsächlich :=
eine neue struct
rekursiv? Wie die Print-Anweisung angezeigt? (. Dh :=
wird eine brandneue Kopie Struktur mit jedem seiner Feldinhalt zurückgeben auch eine brandneue Kopie rekursiv)
Alle Zuweisungen in Go sind Kopien. Die Adressen sind gleich, weil Sie jedes Mal die Adresse des gleichen Wertes nehmen. Experimentieren Sie mit dem Einfügen einiger anderer Werte in diese Strukturen. – JimB
Ich versuche 6 verschiedene Werte zu drucken, Adresse von 'top_level', Adresse von' top_level. Level1 '' top_level.Level1.Level_2' etc ..... Kannst du erklären, warum sie alle gleich sind? – user3591466
Obwohl assign: = top_level, hat assign einen eigenen Speicherplatz im Speicher, der sich von top_level unterscheidet, da es sich um eine neue Zuweisung handelt. Jede Referenz desselben Ortes wird denselben Ort zurückgeben. – Godfrey