2015-09-04 12 views
5

Ich kann es nicht in der Dokumentation zu finden, gibt es eine Garantie, dass die Reihenfolge aus den Feldern die Reihenfolge in der Struktur deklariert übereinstimmen? Ich weiß, es scheint logisch zu sein (aufgrund des Speicherlayouts), und es scheint auch so zu funktionieren, aber ich stelle nur sicher. Ich möchte nicht, dass Code später bricht, wenn dies keine Garantie ist.Reflect Type.Field() Auftrag

Zum Beispiel, wenn ich

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

hatte und ich lief diesen Code:

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") 
} 

Würde garantiert werden tags["bar", "baz", "barbaz"] sein?

+1

Würde [Value.FieldByName] (https://golang.org/pkg/reflect/#Value.FieldByName) in Ihrem Fall helfen? –

+0

Ich wollte nur die Tag-Namen für etwas, es war mehr ich ein fauler Programmierer und versuchen, ein wenig weniger Codierung (die immer in eine Tonne mehr Arbeit, wie es scheint) zu tun. Ich weiß nicht, ob ich mich mehr an diese Methode halten werde, jetzt bin ich nur ein bisschen an der Antwort interessiert. – user3591723

+0

Obwohl GC (der Standard-Go-Compiler) und GCCGO struct-Felder nicht neu ordnen, würde ich mich nicht auf irgendeine Reihenfolge verlassen. Es gibt keine ausdrücklichen Garantien in der Dokumentation. – thwd

Antwort

3

Obwohl GC (der Standard-Go-Compiler) und GCCGO heute keine struct-Felder reorganisieren, würde ich mich nicht auf irgendeine Reihenfolge verlassen. Es gibt keine ausdrücklichen Garantien in der Dokumentation. Dies könnte in einer zukünftigen Version eines der Compiler geschehen.

Die Neuanordnung von Feldern ist eine Technik, die zum Ausrichten von Feldern innerhalb einer Struktur verwendet wird, ohne dass auf den Abstand zurückgegriffen werden muss (wodurch die Speicherdarstellung der Struktur unnötig aufgebläht wird). Sie können in der folgenden Fragen darüber lesen:

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

+0

Ich möchte hinzufügen, dass es sehr unwahrscheinlich ist, da dies viele Dinge, die von dieser Speicherausrichtung abhängig sind, aber Sie immer noch richtig sind. – OneOfOne