2015-09-04 28 views
5

我似乎无法在文档中找到它,是否有任何保证,从字段的顺序将匹配在结构中声明的顺序?我知道这似乎是逻辑上的(由于内存布局),它似乎也是这样执行的,但只是确保。如果这不是保证,我不希望代码稍后再中断。反映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"]

+1

会[Value.FieldByName](https://golang.org/pkg/reflect/#Value.FieldByName)帮助你的情况? –

+0

我只是想要标签名称的东西,它更像是一个懒惰的程序员,并试图做少一点编码(它似乎总是变成一吨多的工作)。我不知道我是否会继续坚持这种方法,现在我只是对答案感兴趣。 – user3591723

+0

即使GC(标准的Go编译器)和GCCGO不重构struct字段,我也不会依赖任何顺序。文档中没有明确的保证。 – thwd

回答

3

尽管今天GC(标准Go编译器)和GCCGO不重构struct字段,但我不会依赖任何顺序。文档中没有明确的保证。这可以在任一编译器的未来版本中完成。

字段重新排序是一种技术,用于在结构内部对内存字段进行内存对齐,而不使用填充(不必要地扩大结构的内存表示)。您可以在以下问题读到它:

Why can't C compilers rearrange struct members to eliminate alignment padding?

+0

我想补充一点,这是不太可能的,因为这会破坏很多依赖内存对齐的东西,但是你仍然是正确的。 – OneOfOne