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.