Warum wird es verboten, die Adresse des (&) Kartenmitglieds zu übernehmen, das (&) Slice-Element ist jedoch zulässig?
Go erlaubt nicht, die Adresse eines Kartenmitglieds zu übernehmen:
// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]
Das Grundprinzip ist, dass die Adresse ungültig werden kann, wenn Go zulässt, diese Adresse zu übernehmen, wenn der Map-Backstore wächst oder schrumpft, was den Benutzer verwirrt.
Aber Go-Slice wird verschoben, wenn seine Kapazität überschritten wird. Mit Go können wir jedoch die Adresse eines Slice-Elements ermitteln:
a := make([]Test, 5)
a[0] = Test{1, "dsfds"}
a[1] = Test{2, "sdfd"}
a[2] = Test{3, "dsf"}
addr1 := reflect.ValueOf(&a[2]).Pointer()
fmt.Println("Address of a[2]: ", addr1)
a = append(a, Test{4, "ssdf"})
addrx := reflect.ValueOf(&a[2]).Pointer()
fmt.Println("Address of a[2] After Append:", addrx)
// Note after append, the first address is invalid
Address of a[2]: 833358258224
Address of a[2] After Append: 833358266416
Warum ist Go so gestaltet? Was ist das Besondere an der Adresse eines Slice-Elements?