2013-05-31 4 views
6

мне было интересно о порядке, в котором некоторые различные типы выражений, поэтому я попробовал этот код в верхнем уровне декларации, думая, что это потерпит неудачу, но обнаружил, что он работает:Порядок оценки выражений

http://play.golang.org/p/CfP3DEC5LP

var x = func() *Foo { 
    fmt.Println(f) // prints &{foobar} 
    return f 
}() 

var f = &Foo{"foobar"} 

type Foo struct { 
    bar string 
} 

Обратите внимание:

  • type Foo struct декларация в нижней

  • до type декларации есть var f декларации и &Foo{] назначения

  • до var декларации, есть функция, которая сразу же вызывается, какие ссылки и возвращает переменную f.

Хотя это не удивило меня слишком много, что я мог бы сделать значение &Foo{}, даже если это имело место до type Foo struct декларации, это удивило меня, что я мог бы успешно ссылаться и напечатать значение f перед его назначением ,

Это надежное и точное поведение? Я не мог найти никакой ссылки на такой порядок в спецификации, но, возможно, я его не замечал.

ответ

10

См the Go programming language reference

В пакете, переменные уровня пакета инициализированы и постоянные значения определяются, в соответствии с порядком ссылки: если инициализатор А зависит от B, A будет установлен после B. Зависимость анализ не зависит от фактических значений элементов, которые инициализированы, только при их появлении в источнике. A зависит от B, если значение A содержит упоминание B, содержит значение, которое инициализатор упоминает B, или упоминает функцию, которая рекурсивно упоминает B, . Это ошибка, если такие зависимости образуют цикл. Если два элемента не являются взаимозависимыми, они будут инициализированы в порядке , они появляются в источнике, возможно, в нескольких файлах, как представлено в компилятору. Поскольку анализ зависимостей производится в упаковке, он может производить неуказанные результаты, если инициализатор A вызывает функцию , определенный в другом пакете, который относится к В.

+0

Спасибо, я прочитал это, но я считаю, что это говорит о пакетных зависимостей. Речь идет о порядке оценки кода в одном пакете. Если это не означает, что «... согласно порядку обращения ...» *? –

+0

... ах да, я думаю, что все. Я считаю, что я был в замешательстве по поводу темы на этом парагарафе, когда я прочитал ее. –

+1

Это на самом деле проясняет нечто большее для меня. Поскольку пакеты можно разделить на несколько файлов, я задался вопросом, какой порядок заказов будет использоваться. Это, по-видимому, дает понять, что упорядочение не имеет значения, поскольку переменные инициализируются в порядке их использования ... если это имеет смысл. –

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