Looping closures

Променливата във for loop се преизползва. Може би това не прави каквото си мислите

package main
import (
    "fmt"
    "sync"
    "time"
)
func main() {
    var wg sync.WaitGroup

    for i := 0; i < 15; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            time.Sleep(500 * time.Millisecond)
            fmt.Println(i)
        }()
    }
    wg.Wait()
}

За да видите всичките числа от 0 до 14:

for i := 0; i < 15; i++ {
    wg.Add(1)
    go func(localI int) {
        defer wg.Done()
        time.Sleep(500 * time.Millisecond)
        fmt.Println(localI)
    }(i)
}

Или също е възможно да си направите отделна променлива, която да ползвате през closure.

for i := 0; i < 15; i++ {
    wg.Add(1)
    i := i // nothing to see here, move along!
    go func() {
        defer wg.Done()
        time.Sleep(500 * time.Millisecond)
        fmt.Println(i)
    }()
}

Това е малко странно, но е идиоматично Go.