мне было интересно о порядке, в котором некоторые различные типы выражений, поэтому я попробовал этот код в верхнем уровне декларации, думая, что это потерпит неудачу, но обнаружил, что он работает:Порядок оценки выражений
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
перед его назначением ,
Это надежное и точное поведение? Я не мог найти никакой ссылки на такой порядок в спецификации, но, возможно, я его не замечал.
Спасибо, я прочитал это, но я считаю, что это говорит о пакетных зависимостей. Речь идет о порядке оценки кода в одном пакете. Если это не означает, что «... согласно порядку обращения ...» *? –
... ах да, я думаю, что все. Я считаю, что я был в замешательстве по поводу темы на этом парагарафе, когда я прочитал ее. –
Это на самом деле проясняет нечто большее для меня. Поскольку пакеты можно разделить на несколько файлов, я задался вопросом, какой порядок заказов будет использоваться. Это, по-видимому, дает понять, что упорядочение не имеет значения, поскольку переменные инициализируются в порядке их использования ... если это имеет смысл. –