2015-09-04 7 views
5

Non riesco a trovarlo nella documentazione, è possibile garantire che l'ordine dei campi corrisponda all'ordine dichiarato nella struttura? So che sembra logico (a causa del layout della memoria) e sembra funzionare anche in questo modo, ma solo per essere sicuro. Non voglio che il codice si interrompa più tardi se questa non è una garanzia.Riflettere l'ordine Type.Field()

Per esempio, se ho avuto

type Foo struct { 
    bar string `tag:"bar"` 
    baz string `tag:"baz"` 
    barbaz string `tag:"barbaz"` 
} 

e ho corso questo codice:

var c Foo 
t := reflect.TypeOf(c) 
nf := t.NumField() 

tags := make([]string, nf) 

for f := 0; f < nf; f++ { 
    tags[f] = t.Field(f).Tag.Get("tag") 
} 

Would tags essere garantita come ["bar", "baz", "barbaz"]?

+1

Potrebbe [Value.FieldByName] (https://golang.org/pkg/reflect/#Value.FieldByName) aiutare nel tuo caso? –

+0

Volevo solo che i nomi dei tag avessero qualcosa, ero più un programmatore pigro e cercavo di fare un po 'meno di programmazione (che sembra sempre più un lavoro). Non so se continuerò a seguire questo metodo, ora sono solo un po 'interessato alla risposta. – user3591723

+0

Anche se GC (il compilatore standard di Go) e GCCGO non modificano i campi struct, non fare affidamento su alcun ordine. Non ci sono garanzie espresse nella documentazione. – thwd

risposta

3

Anche se GC (il compilatore standard di Go) e GCCGO non riordinano i campi struct oggi, non fare affidamento su alcun ordine. Non ci sono garanzie espresse nella documentazione. Questo potrebbe essere fatto in una versione futura di entrambi i compilatori.

Il riordinamento dei campi è una tecnica utilizzata per allineare i campi di memoria all'interno di una struttura senza ricorrere al riempimento (inutilmente gonfiando la rappresentazione della memoria della struttura). Si può leggere su di esso nella seguente domanda:

Why can't C compilers rearrange struct members to eliminate alignment padding?

+0

Mi piacerebbe aggiungere che è molto improbabile dal momento che ciò spezzerebbe un sacco di cose che dipendono dall'allineamento della memoria, ma tu sei ancora corretto. – OneOfOne

Problemi correlati