反映 Type.Field() 顺序

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


例如,如果我有


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"]?


慕桂英4014372
浏览 185回答 2
2回答

千万里不及你

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

青春有我

尽管今天 GC(标准 Go 编译器)和 GCCGO 不重新编码结构字段,但我不会依赖任何排序。文档中没有明确的保证。这可能会在任一编译器的未来版本中完成。字段重新排序是一种用于在不使用填充(不必要地膨胀结构的内存表示)的情况下对结构内的字段进行内存对齐的技术。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go