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") } |
是否保证
即使gc(标准的go编译器)和gcgo今天不重新排序结构字段,我也不会依赖于任何排序。文件中没有明确的保证。这可以在未来的编译器版本中完成。
字段重新排序是一种技术,用于在不使用填充(不必要地膨胀结构的内存表示)的情况下,对结构内部的字段进行内存对齐。您可以在以下问题中阅读:
为什么C编译器不能重新排列结构成员以消除对齐填充?
我问了歌朗的坚果这个问题,并得到了伊恩兰斯泰勒的答复,确认它的申报顺序,不会改变。