关于go:反映Type.Field()命令


Reflect Type.Field() order

我似乎在文档中找不到它,是否可以保证字段中的顺序与结构中声明的顺序匹配?我知道这看起来是合乎逻辑的(由于内存布局),而且它似乎也以这种方式执行,但只是确保。如果这不是一个保证,我不希望以后代码被破坏。

例如,如果我有

1
2
3
4
5
type Foo struct {
    bar    string `tag:"bar"`
    baz    string `tag:"baz"`
    barbaz string `tag:"barbaz"`
}

我运行了以下代码:

1
2
3
4
5
6
7
8
9
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编译器)和gcgo今天不重新排序结构字段,我也不会依赖于任何排序。文件中没有明确的保证。这可以在未来的编译器版本中完成。

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

为什么C编译器不能重新排列结构成员以消除对齐填充?


我问了歌朗的坚果这个问题,并得到了伊恩兰斯泰勒的答复,确认它的申报顺序,不会改变。