这两种结构之间有什么区别,除了它们不被认为是等价的?
package main
import "fmt"
func main() {
a := struct{int}{1}
b := struct{int int}{1}
fmt.Println(a,b)
a.int=2
b.int=a.int
fmt.Println(a,b)
//a = b
}
他们看起来一样:
$ go run a.go
{1} {1}
{2} {2}
但是,如果您取消注释a = b
,它会说:
$ go run a.go
# command-line-arguments
./a.go:10: cannot use b (type struct { int int }) as type struct { int } in assignment
但struct{a,b int}
和struct{a int;b int}
是等效的:
package main
func main() {
a := struct{a,b int}{1,2}
b := struct{a int;b int}{1,2}
a = b
b = a
}
答案 0 :(得分:9)
struct { int }
是一个结构,其中包含int
类型的匿名字段。
struct { int int }
是一个结构,其中包含int
类型int
的字段。
int
不是关键字;它可以用作标识符。
结构类型不相同;相应的字段名称不同。
使用类型但没有显式字段名称声明的字段是匿名字段,非限定类型名称充当匿名字段名称。因此,字段名称a.int
和b.int
有效。例如,
a := struct{ int }{1}
b := struct{ int int }{1}
a.int = 2
b.int = a.int
The Go Programming Language Specification
结构是一系列命名元素,称为字段,每个元素 有一个名字和类型。可以明确指定字段名称 (IdentifierList)或隐式(AnonymousField)。在结构中, 非空白字段名称必须是唯一的。
StructType = "struct" "{" { FieldDecl ";" } "}" . FieldDecl = (IdentifierList Type | AnonymousField) [ Tag ] . AnonymousField = [ "*" ] TypeName .
使用类型但没有显式字段名称声明的字段是 匿名字段,也称为嵌入字段或嵌入字段 输入结构。必须将嵌入类型指定为类型名称 T或作为指向非接口类型名称* T的指针,以及T本身可以 不是指针类型。非限定类型名称充当字段 名。
以下关键字已保留,不得用作 标识符
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
如果两个结构类型具有相同的序列,则它们是相同的 字段,如果相应的字段具有相同的名称,并且相同 类型和相同的标签。两个匿名字段被认为具有 同名。来自不同包的小写字段名称是 永远不同。