我似乎无法在文档中找到它,是否可以保证字段中的顺序与结构中声明的顺序相匹配?我知道它似乎在逻辑上(由于内存布局),它似乎也以这种方式执行,但只是确保.如果这不是保证,我不希望代码稍后破坏.
例如,如果我有
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"]吗?
即使GC(标准的Go编译器)和GCCGO现在不再使用struct字段,我也不会依赖任何顺序。文档中没有明确的保证。这可以在任一编译器的将来版本中完成。
字段重新排序是一种用于对结构内部的字段进行内存对齐而无需求助于填充(不必要夸大结构的内存表示形式)的技术。您可以在以下问题中阅读它: