github.com/likebike/go--@v0.0.0-20190911215757-0bd925d16e96/go/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 "loop variable i captured by func literal"
    14  			println(v) // ERROR "loop variable v captured by func literal"
    15  		}()
    16  	}
    17  	for i, v := range s {
    18  		defer func() {
    19  			println(i) // ERROR "loop variable i captured by func literal"
    20  			println(v) // ERROR "loop variable v captured by func literal"
    21  		}()
    22  	}
    23  	for i := range s {
    24  		go func() {
    25  			println(i) // ERROR "loop variable i captured by func literal"
    26  		}()
    27  	}
    28  	for _, v := range s {
    29  		go func() {
    30  			println(v) // ERROR "loop 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 "loop 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 "loop variable v captured by func literal"
    66  		}()
    67  	}
    68  
    69  	// ordinary for-loops
    70  	for i := 0; i < 10; i++ {
    71  		go func() {
    72  			print(i) // ERROR "loop variable i captured by func literal"
    73  		}()
    74  	}
    75  	for i, j := 0, 1; i < 100; i, j = j, i+j {
    76  		go func() {
    77  			print(j) // ERROR "loop variable j captured by func literal"
    78  		}()
    79  	}
    80  	type cons struct {
    81  		car int
    82  		cdr *cons
    83  	}
    84  	var head *cons
    85  	for p := head; p != nil; p = p.next {
    86  		go func() {
    87  			print(p.car) // ERROR "loop variable p captured by func literal"
    88  		}()
    89  	}
    90  }