这两种结构之间有什么区别,除了它们不被认为是等价的?
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}) {}
答案 0 :(得分:5)
"结构的顺序'字段在低层次上很重要"怎么样?
这会影响反射,例如func (v Value) Field(i int) Value
:
字段返回struct v
的第i个字段
第一个字段' a'第一个结构中的第一个结构在第二个结构中不会是相同的 这也将影响序列化与marshaler methods (encoding package)。
答案 1 :(得分:4)
类型和值的属性
如果两个结构类型具有相同的序列,则它们是相同的 字段,如果相应的字段具有相同的名称,并且相同 类型和相同的标签。
相应的字段名称不同:
s struct{a int;b int}
与
s struct{b int;a int}
答案 2 :(得分:3)
来自spec:
两个结构类型相同如果它们具有相同的字段序列,并且相应的字段具有相同的名称,相同的类型和相同的标记。两个匿名字段被认为具有相同的名称。不同包中的小写字段名称总是不同的。
结构字段的顺序在低级别上很重要,因此不能将两个具有不同字段序列的结构视为等效。