2015-11-12 5 views
0

Учитывая следующий код:Что делает значение const в поле анонимной структуры?

type NodeType int 

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

type ListNode struct { 
    NodeType 
} 

Что такое объяснение в том числе NodeType типа в качестве анонимного поля в ListNode структуры? Является ли это своего рода идентификатором для структуры?

ответ

2

Для такого анонимного или внедренного поле, в The Go Programming Language Specification,

Название неквалифицированным типа действует как имя поля.

В вашем случае, вы можете написать следующее:

var node1 ListNode 
node1.NodeType = NodeText 

или

node2 := ListNode{NodeText} 

или

node3 := ListNode{ 
    NodeType: NodeText, 
} 

Все три создать такое же значение.

2

NodeType не является постоянным. Это тип, и он был встроен в структуру ListNode.

Типы конструкций могут содержать анонимные или встроенные поля. Это также называется вложением типа. Когда мы встраиваем тип в структуру , имя типа действует как имя поля для того, что тогда является встроенным полем.

например. Вы должны установить 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

Это не «анонимными поле» функция языка используется называется «вложение 'и это своего рода метод Go для решения наследования. В Go, если StructA вставляет StructB, тогда поля на StructB и методы с приемным типом StructB станут доступны непосредственно на StructA. Тем не менее применяются те же правила для экспортированных и неэкспортированных (т. Е. Неэкспортированные поля в StructB не будут доступны вне области пакетов, как обычно). Я не могу сказать, зачем вам это значение во всех ваших структурах, это просто эффективный способ сделать это. В конце концов, это всего лишь int, и вы просто сохраняете несколько строк кода, не давая им фактического имени, не более того.

 Смежные вопросы

  • Нет связанных вопросов^_^