struct {a int; b int}和struct {b int; a int}之间有什么区别?

时间:2014-08-26 14:46:35

标签: types go

这两种结构之间有什么区别,除了它们不被认为是等价的?

package main
func main() {}
func f1(s struct{a int;b int}) { f2(s) }
func f2(s struct{b int;a int}) {}

$ go run a.go 
# command-line-arguments
./a.go:3: cannot use s (type struct { a int; b int }) as type struct { b int; a int } in argument to f2

注意:此 编译:

package main
func main() {}
func f1(s struct{a int;b int}) { f2(s) }
func f2(s struct{a int;b int}) {}

3 个答案:

答案 0 :(得分:5)

  

"结构的顺序'字段在低层次上很重要"怎么样?

这会影响反射,例如func (v Value) Field(i int) Value

  

字段返回struct v

的第i个字段

第一个字段' a'第一个结构中的第一个结构在第二个结构中不会是相同的 这也将影响序列化marshaler methods (encoding package)

答案 1 :(得分:4)

  

类型和值的属性

     

Type identity

     

如果两个结构类型具有相同的序列,则它们是相同的   字段,如果相应的字段具有相同的名称,并且相同   类型和相同的标签。

相应的字段名称不同:

s struct{a int;b int}

s struct{b int;a int}

答案 2 :(得分:3)

来自spec

  

两个结构类型相同如果它们具有相同的字段序列,并且相应的字段具有相同的名称,相同的类型和相同的标记。两个匿名字段被认为具有相同的名称。不同包中的小写字段名称总是不同的。

结构字段的顺序在低级别上很重要,因此不能将两个具有不同字段序列的结构视为等效。