前往:匿名功能仅在范围内取最后一个值

I imagine this is a pretty easy fix. Just trying loop through the string list urls and print out each url as the loop iterates. But when I add in concurrency (with go and WaitGroup) all it prints out is the last url in the list.

Why is it only printing out the last url (when printed from the anon function) rather than each url individually as the loop iterates?

Go Playground: http://play.golang.org/p/z4IZLY7Mt_


Code:

package main

import (
    "fmt"
    "sync"
)

var urls = []string{
    "http://google.com",
    "http://facebook.com",
    "http://youtube.com",
    "http://yahoo.com",
    "http://baidu.com",
    "http://wikipedia.org",
    "http://twitter.com",
    "http://live.com",
    "http://amazon.com",
    "http://linkedin.com",
    "http://google.co.in",
}

func main() {
    var wg sync.WaitGroup
    for _, url := range urls {
        fmt.Println("correct: " + url)
        wg.Add(1)
        go func() {
            fmt.Println("wrong: " + url)
            wg.Done()
        }()
    }

    wg.Wait()
}

Here is the working code:

package main

import (
    "fmt"
    "sync"
)

var urls = []string{
    "http://google.com",
    "http://facebook.com",
    "http://youtube.com",
    "http://yahoo.com",
    "http://baidu.com",
    "http://wikipedia.org",
    "http://twitter.com",
    "http://live.com",
    "http://amazon.com",
    "http://linkedin.com",
    "http://google.co.in",
}

func main() {
    var wg sync.WaitGroup
    for _, url := range urls {
        fmt.Println("correct: " + url)
        wg.Add(1)
        go func(url string) {
            fmt.Println("wrong: " + url)
            wg.Done()
        }(url)
    }

    wg.Wait()
}

Also on go playground: http://play.golang.org/p/zFSDvfdIDS