68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| 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)
 | |
| 	}
 | |
| }
 |