const值在匿名结构域中的作用是什么?

时间:2015-11-12 20:54:59

标签: struct go const anonymous

给出以下代码:

type NodeType int

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

type ListNode struct {
    NodeType
}

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

3 个答案:

答案 0 :(得分:2)

对于此类匿名嵌入字段,按The Go Programming Language Specification

  

非限定类型名称充当字段名称。

在您的情况下,您可以写下以下内容:

var node1 ListNode
node1.NodeType = NodeText

node2 := ListNode{NodeText}

node3 := ListNode{
    NodeType: NodeText,
}

这三个都创造了相同的价值。

答案 1 :(得分:2)

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

  

结构类型可以包含匿名或嵌入字段。   这也称为嵌入类型。当我们将一个类型嵌入到   struct,类型的名称作为当时的字段名称   嵌入式领域。

e.g。您可以根据以下内容为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

答案 2 :(得分:2)

这不是一个匿名字段'正在使用的语言功能被称为“嵌入”。这是Go解决继承问题的一种方式。在Go中,如果StructA嵌入StructB,则StructB上的字段和接收类型为StructB的方法将在StructA上直接访问。但是,导出vs未导出的相同规则适用(即StructB中未导出的字段不能像正常一样在包范围之外访问)。我不能说你为什么要在所有结构中使用这个值,这只是一种有效的方法。在一天结束时,它只是一个int而你只是通过不给它一个实际名称来保存几行代码,而不是真的。