2013-05-31 9 views
6

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 dole

  • przed deklaracją type istnieje var f deklaracja i &Foo{] przypisanie

  • przed 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.

Odpowiedz

10

Patrz the Go programming language reference

w opakowaniu, zmienne poziomu pakietu są inicjowane i stałe wartości są określane zgodnie ze zleceniem odniesienia: jeśli inicjatora z A zależy od B, zostanie wyznaczony po B. Zależność Analiza nie zależy od rzeczywistych wartości pozycji, które są zainicjalizowane, tylko po ich pojawieniu się w źródle. A zależy od B, jeśli wartość A zawiera wzmiankę o B, zawiera wartość, której inicjator wymienia B lub wspomina o funkcji, która rekurencyjnie wspomina B, . Jest to błąd, jeśli takie zależności tworzą cykl. Jeśli dwa elementy nie są współzależne, zostaną zainicjowane w kolejności pojawiają się w źródle, prawdopodobnie w wielu plikach, tak jak przedstawiono je kompilatorowi w postaci . Ponieważ analiza zależność odbywa się w opakowaniu, to może produkować nieokreślonych wyników Jeżeli za inicjatora wywołuje funkcję zdefiniowany w innym opakowaniu, które odnosi się do B.

+0

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 ..." *? –

+0

... ah tak, myślę, że to wszystko. Sądzę, że byłam zmieszana z powodu tego paragraftu, kiedy to przeczytałem. –

+1

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. –