【问题标题】:What does a const value do in an anonymous struct field?const 值在匿名结构字段中的作用是什么?
【发布时间】:2015-11-12 20:54:58
【问题描述】:

给定以下代码:

type NodeType int

const (
    NodeText NodeType = iota
    NodeAction
    // etc..
)

type ListNode struct {
    NodeType
}

NodeType 类型作为匿名字段包含在ListNode 结构中的解释是什么?它是否用作结构的某种标识符?

【问题讨论】:

    标签: struct go constants anonymous


    【解决方案1】:

    对于这样的匿名嵌入式字段,根据The Go Programming Language Specification

    不合格的类型名称充当字段名称。

    在你的情况下,你可以写如下:

    var node1 ListNode
    node1.NodeType = NodeText
    

    node2 := ListNode{NodeText}
    

    node3 := ListNode{
        NodeType: NodeText,
    }
    

    所有三个创造相同的价值。

    【讨论】:

      【解决方案2】:

      NodeType 不是一个常数。它是一种类型,它已嵌入到 ListNode 结构中。

      结构类型能够包含匿名或嵌入字段。 这也称为嵌入类型。当我们将一个类型嵌入到 struct,类型的名称充当字段名称,然后 嵌入字段。

      例如您可以将NodeType 设置为ListNode,如下所示:

      ln := &ListNode{NodeType: NodeText}
      fmt.Println(ln)
      // Outputs: &{0}
      

      进一步阅读:http://www.goinggo.net/2014/05/methods-interfaces-and-embedded-types.html(向下滚动)和https://golang.org/doc/effective_go.html#embedding

      【讨论】:

        【解决方案3】:

        这不是“匿名字段”,所使用的语言特性称为“嵌入”,它是 Go 处理继承的一种方式。在 Go 中,如果StructA 嵌入了StructB,那么StructB 上的字段和接收类型为StructB 的方法将可以在StructA 上直接访问。但是,导出与未导出的规则相同(即,StructB 中的未导出字段将无法像正常一样在包范围之外访问)。我不能说你为什么要在所有结构中使用这个值,这只是一种有效的方法。归根结底,它只是一个 int,而您只是通过不给它一个实际名称来节省几行代码,仅此而已。

        【讨论】:

          猜你喜欢
          • 2019-12-31
          • 1970-01-01
          • 2012-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-06
          相关资源
          最近更新 更多