| package main |
| |
| import "fmt" |
| |
| // Test of initialization order of package-level vars. |
| |
| var counter int |
| |
| func next() int { |
| c := counter |
| counter++ |
| return c |
| } |
| |
| func next2() (x int, y int) { |
| x = next() |
| y = next() |
| return |
| } |
| |
| func makeOrder() int { |
| _, _, _, _ = f, b, d, e |
| return 0 |
| } |
| |
| func main() { |
| // Initialization constraints: |
| // - {f,b,c/d,e} < order (ref graph traversal) |
| // - order < {a} (lexical order) |
| // - b < c/d < e < f (lexical order) |
| // Solution: a b c/d e f |
| abcdef := [6]int{a, b, c, d, e, f} |
| if abcdef != [6]int{0, 1, 2, 3, 4, 5} { |
| panic(abcdef) |
| } |
| } |
| |
| var order = makeOrder() |
| |
| var a, b = next(), next() |
| var c, d = next2() |
| var e, f = next(), next() |
| |
| // ------------------------------------------------------------------------ |
| |
| var order2 []string |
| |
| func create(x int, name string) int { |
| order2 = append(order2, name) |
| return x |
| } |
| |
| var C = create(B+1, "C") |
| var A, B = create(1, "A"), create(2, "B") |
| |
| // Initialization order of package-level value specs. |
| func init() { |
| x := fmt.Sprint(order2) |
| // Result varies by toolchain. This is a spec bug. |
| if x != "[B C A]" && // gc |
| x != "[A B C]" { // go/types |
| panic(x) |
| } |
| if C != 3 { |
| panic(c) |
| } |
| } |