反映Type.Field()顺序

use*_*723 6 go

我似乎无法在文档中找到它,是否可以保证字段中的顺序与结构中声明的顺序相匹配?我知道它似乎在逻辑上(由于内存布局),它似乎也以这种方式执行,但只是确保.如果这不是保证,我不希望代码稍后破坏.

例如,如果我有

type Foo struct {
    bar    string `tag:"bar"`
    baz    string `tag:"baz"`
    barbaz string `tag:"barbaz"`
}
Run Code Online (Sandbox Code Playgroud)

我运行了这段代码:

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")
}
Run Code Online (Sandbox Code Playgroud)

tags保证是["bar", "baz", "barbaz"]吗?

thw*_*hwd 5

即使GC(标准的Go编译器)和GCCGO现在不再使用struct字段,我也不会依赖任何顺序。文档中没有明确的保证。这可以在任一编译器的将来版本中完成。

字段重新排序是一种用于对结构内部的字段进行内存对齐而无需求助于填充(不必要夸大结构的内存表示形式)的技术。您可以在以下问题中阅读它:

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


小智 5

我在 golang-nuts 上问过这个问题,得到了 Ian Lance Taylor 的回答,确认它是声明顺序,不会改变。