【问题标题】:What is the difference between struct{int} and struct{int int}?struct{int} 和 struct{int int} 有什么区别?
【发布时间】:2014-10-20 08:37:18
【问题描述】:

这两个结构除了不被视为等效之外,还有什么区别?

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
}

?

【问题讨论】:

    标签: types go


    【解决方案1】:

    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

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

    【讨论】:

    • 字段名称不同?那为什么a.intb.int 都有效呢?
    • @Dog:对于匿名字段,非限定类型名作为匿名字段名。请参阅我修改后的答案。
    • 我认为这个想法(如果我错了,请纠正我,@peterSO)是虽然int 可用于访问该字段,但它与该字段的名称不同的是astruct{ a int } 中字段的名称(因此不是用于类型相等的名称)。
    • @synful:是的,有两个问题。首先,这两种类型是否相同(完全相同)?适用类型标识规则;显式字段名称必须完全相同。二、如何引用匿名字段?非限定类型名称充当隐式字段名称。
    • 您粘贴的内容似乎暗示struct{int}=struct{int int}。但我认为这里没有足够的信息可以确定。无论哪种情况,我都在寻找这两种类型的实际不同之处,而不是编译器认为它们不同。
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 2017-02-23
    • 2020-05-05
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多