我似乎无法在文档中找到它,是否有任何保证,从字段的顺序将匹配结构中声明的顺序?我知道它似乎在逻辑上(由于内存布局),它似乎也以这种方式执行,但只是确保。如果这不是一个保证,我不希望代码在以后中断。
例如,如果我有
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"]
吗?
我在golang-nuts上询问了这个问题,并得到了Ian Lance Taylor的回答,确认了它的声明顺序,并且不会改变。
这是字段在结构声明中出现的顺序。它不会改变。如果发现不是的情况,则订单在申报时,请提交bug。谢谢。
即使GC(标准的Go编译器)和GCCGO现在不重新排序结构字段,我也不会依赖任何排序。文档中没有明确的保证。这可能在任何编译器的未来版本中完成。
字段重排序是一种用于在结构体内部对字段进行内存对齐而不使用填充(不必要地增加结构体的内存表示)的技术。你可以在下面的问题中读到它:
为什么C编译器可以重新排列结构成员来消除对齐填充?