Go non permette di prendere l'indirizzo di un membro di mappa:Perché non proibire di prendere l'indirizzo di (&) membro della mappa, ma consente l'elemento (&) slice?
// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]
La logica è che se Go permette di prendere questo indirizzo, quando la mappa interni del supermercato cresce o shinks, l'indirizzo può diventare valido, confondere l'utente .
Ma Vai fetta viene trasferita quando diventa troppo grande per la sua capacità, tuttavia, Go ci permette di prendere l'indirizzo di un elemento fetta:
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
Perché Go progettato come questo? Cosa c'è di speciale nel prendere l'indirizzo dell'elemento slice?
Leggi questo: [Vai: le matrici e le mappe devono essere concetti/caratteristiche diverse?] (Http://stackoverflow.com/questions/25294290/go-do-arrays-and-maps-have-to-be -differenti-concetti-funzioni) – icza
Sfortunatamente, nulla è speciale riguardo al prendere l'indirizzo di un elemento slice - se continui ad usare quel primo indirizzo dopo che lo slice cresce (piuttosto che eseguire il codice '& a [2]' again post-' append', come stai facendo), avrai ancora puntatori nel vecchio array, quindi non puoi usarlo per vedere o fare aggiornamenti al nuovo array, e il vecchio array è ancora raggiungibile e quindi non garbage- da collezione. L'indirizzo di correzione – twotwotwo
per la mappa è più difficile che correggere l'indirizzo per l'array, penso. –