github.com/karrick/go@v0.0.0-20170817181416-d5b0ec858b37/src/cmd/vet/testdata/rangeloop.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file contains tests for the rangeloop checker. 6 7 package testdata 8 9 func RangeLoopTests() { 10 var s []int 11 for i, v := range s { 12 go func() { 13 println(i) // ERROR "range variable i captured by func literal" 14 println(v) // ERROR "range variable v captured by func literal" 15 }() 16 } 17 for i, v := range s { 18 defer func() { 19 println(i) // ERROR "range variable i captured by func literal" 20 println(v) // ERROR "range variable v captured by func literal" 21 }() 22 } 23 for i := range s { 24 go func() { 25 println(i) // ERROR "range variable i captured by func literal" 26 }() 27 } 28 for _, v := range s { 29 go func() { 30 println(v) // ERROR "range variable v captured by func literal" 31 }() 32 } 33 for i, v := range s { 34 go func() { 35 println(i, v) 36 }() 37 println("unfortunately, we don't catch the error above because of this statement") 38 } 39 for i, v := range s { 40 go func(i, v int) { 41 println(i, v) 42 }(i, v) 43 } 44 for i, v := range s { 45 i, v := i, v 46 go func() { 47 println(i, v) 48 }() 49 } 50 // If the key of the range statement is not an identifier 51 // the code should not panic (it used to). 52 var x [2]int 53 var f int 54 for x[0], f = range s { 55 go func() { 56 _ = f // ERROR "range variable f captured by func literal" 57 }() 58 } 59 type T struct { 60 v int 61 } 62 for _, v := range s { 63 go func() { 64 _ = T{v: 1} 65 _ = []int{v: 1} // ERROR "range variable v captured by func literal" 66 }() 67 } 68 }