golang.org/x/tools@v0.21.0/go/ssa/interp/testdata/rangeoverint.go (about) 1 package main 2 3 // Range over integers. 4 5 // Currently requires 1.22 and GOEXPERIMENT=range. 6 7 import "fmt" 8 9 func f() { 10 s := "AB" 11 for range 5 { 12 s += s 13 } 14 if s != "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB" { 15 panic(s) 16 } 17 18 var t []int 19 for i := range 10 { 20 t = append(t, i) 21 } 22 if got, want := fmt.Sprint(t), "[0 1 2 3 4 5 6 7 8 9]"; got != want { 23 panic(got) 24 } 25 26 var u []uint 27 for i := range uint(3) { 28 u = append(u, i) 29 } 30 if got, want := fmt.Sprint(u), "[0 1 2]"; got != want { 31 panic(got) 32 } 33 34 for i := range 0 { 35 panic(i) 36 } 37 38 for i := range int(-1) { 39 panic(i) 40 } 41 42 for _, test := range []struct { 43 x int 44 b, c bool 45 want string 46 }{ 47 {-1, false, false, "[-123 -123]"}, 48 {0, false, false, "[-123 -123]"}, 49 {1, false, false, "[-123 0 333 333]"}, 50 {2, false, false, "[-123 0 333 1 333 333]"}, 51 {2, false, true, "[-123 0 222 1 222 222]"}, 52 {2, true, false, "[-123 0 111 111]"}, 53 {3, false, false, "[-123 0 333 1 333 2 333 333]"}, 54 } { 55 got := fmt.Sprint(valueSequence(test.x, test.b, test.c)) 56 if got != test.want { 57 panic(fmt.Sprint(test, got)) 58 } 59 } 60 } 61 62 // valueSequence returns a sequence of the values of i. 63 // b causes an early break and c causes a continue. 64 func valueSequence(x int, b, c bool) []int { 65 var vals []int 66 var i int = -123 67 vals = append(vals, i) 68 for i = range x { 69 vals = append(vals, i) 70 if b { 71 i = 111 72 vals = append(vals, i) 73 break 74 } else if c { 75 i = 222 76 vals = append(vals, i) 77 continue 78 } 79 i = 333 80 vals = append(vals, i) 81 } 82 vals = append(vals, i) 83 return vals 84 } 85 86 func main() { f() }