Search code examples
goreflectiongo-reflect

Reflect Type.Field() order


I can't seem to find it in documentation, is there any guarantee that the order from the fields will match the order declared in the struct? I know it seems like it would logically (due to memory layout),and it seems to perform this way too, but just making sure. I don't want code to break later on if this isn't a guarantee.

For example, if I had

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

and I ran this 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")
}

Would tags be guaranteed to be ["bar", "baz", "barbaz"]?


Solution

  • Even though GC (the standard Go compiler) and GCCGO don't reoder struct fields today, I wouldn't rely on any ordering. There are no express guarantees in the documentation. This might be done in a future version of either compiler.

    Field reordering is a technique used to memory-align fields inside of a struct without resorting to padding (unnecessarily inflating the struct's memory representation). You can read about it in the following question:

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