给出以下代码:
type NodeType int
const (
NodeText NodeType = iota
NodeAction
// etc..
)
type ListNode struct {
NodeType
}
在NodeType
结构中将ListNode
类型包含为匿名字段的解释是什么?它是否作为结构的某种标识符?
答案 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而你只是通过不给它一个实际名称来保存几行代码,而不是真的。