反映 Type.Field() 顺序

Reflect Type.Field() order

我似乎无法在文档中找到它,是否有任何 gua运行tee 表明字段中的顺序将与结构中声明的顺序相匹配?我知道这似乎符合逻辑(由于内存布局),而且它似乎也以这种方式执行,但只是确定一下。如果这不是 gua运行tee.

,我不希望代码在以后中断

例如,如果我有

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

我运行这个代码:

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

tags会成为运行["bar", "baz", "barbaz"]吗?

即使 GC(标准 Go 编译器)和 GCCGO 今天不重新排序结构字段,我也不会依赖任何顺序。文档中没有明确的保证。这可能会在任一编译器的未来版本中完成。

字段重新排序是一种用于在不诉诸填充的情况下对结构内的字段进行内存对齐的技术(不必要地膨胀结构的内存表示)。您可以在以下问题中了解它:

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

我在 golang-nuts 上询问过这个问题,an answer from Ian Lance Taylor 确认了它的声明顺序,并且不会改变。

It's the order in which the fields appear in the struct declaration. It's not going to change. If you find a case where it is not the order in the declaration, please file a bug. Thanks.