byłem ciekaw o kolejności, w której niektóre różne rodzaje wyrażeń, więc próbowałem ten kod na najwyższym poziomie deklaracji, myśląc, że to się nie uda, ale okazało się, że to działa:Zamówienie ewaluacji wyrażeń
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
}
Uwaga:
deklaracja
type Foo struct
jest na doleprzed deklaracją
type
istniejevar f
deklaracja i&Foo{]
przypisanieprzed deklaracją
var
, nie ma funkcji, która jest wywoływana natychmiast, które z dokumentów i zwraca zmiennąf
.
Choć nie dziwi mnie zbytnio, że mogę uczynić wartość &Foo{}
choć miało to miejsce przed deklaracją type Foo struct
, to nie dziwi mnie, że mogę z powodzeniem odwołać i wydrukować wartości f
przed jego przypisanie .
Czy to jest niezawodne i określone zachowanie? Nie mogłem znaleźć żadnego odniesienia do takiego rozkazu w specyfikacji, ale być może przeoczyłem to.
Dzięki, czytałem to, ale uważam, że to jest mówienie o zależności pakietów. Pytanie dotyczy kolejności oceny kodu w ramach tego samego pakietu. O ile nie ma to znaczenia "* zgodnie z porządkiem odniesienia ..." *? –
... ah tak, myślę, że to wszystko. Sądzę, że byłam zmieszana z powodu tego paragraftu, kiedy to przeczytałem. –
To faktycznie wyjaśnia mi coś znacznie większego. Ponieważ pakiety można podzielić na wiele plików, zastanawiałem się, jaki rodzaj uporządkowania plików zostanie użyty. Wydaje się to wyjaśniać, że kolejność będzie nieistotna, ponieważ zmienne są inicjowane w kolejności ich użycia ... jeśli ma to sens. –