struct {int}和struct {int int}有什么区别?

时间:2014-08-26 21:44:48

标签: types go

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

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
}

1 个答案:

答案 0 :(得分:9)

struct { int }是一个结构,其中包含int类型的匿名字段。

struct { int int }是一个结构,其中包含int类型int的字段。

int不是关键字;它可以用作标识符。

结构类型不相同;相应的字段名称不同。

使用类型但没有显式字段名称声明的字段是匿名字段,非限定类型名称充当匿名字段名称。因此,字段名称a.intb.int有效。例如,

a := struct{ int }{1}
b := struct{ int int }{1}
a.int = 2
b.int = a.int
  

The Go Programming Language Specification

     

Struct types

     

结构是一系列命名元素,称为字段,每个元素   有一个名字和类型。可以明确指定字段名称   (IdentifierList)或隐式(AnonymousField)。在结构中,   非空白字段名称必须是唯一的。

StructType     = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl      = (IdentifierList Type | AnonymousField) [ Tag ] .
AnonymousField = [ "*" ] TypeName .
     

使用类型但没有显式字段名称声明的字段是   匿名字段,也称为嵌入字段或嵌入字段   输入结构。必须将嵌入类型指定为类型名称   T或作为指向非接口类型名称* T的指针,以及T本身可以   不是指针类型。非限定类型名称充当字段   名。

     

Keywords

     

以下关键字已保留,不得用作   标识符

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
     

Type identity

     

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