Go:Anonymous Func仅在范围内取最后一个值

时间:2014-07-10 15:51:46

标签: go

我想这是一个非常简单的修复方法。只需尝试循环遍历字符串列表urls并在循环迭代时打印出每个url。但是当我添加并发(使用goWaitGroup)时,所有打印输出的都是列表中的最后一个url

为什么在循环迭代时只打印出最后一个url(从anon函数打印时)而不是每个url

去游乐场:http://play.golang.org/p/z4IZLY7Mt_


代码:

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()
}

1 个答案:

答案 0 :(得分:0)

以下是工作代码:

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()
}

同样在游乐场:http://play.golang.org/p/zFSDvfdIDS