goroutine接收器接收器并将字符串发送到通道



我正在尝试制作一个goroutines的循环,以接收字符串的通道,每次收到它时,它都应将值附加到另一个字符串。仅在所有goroutines的末尾(Goroutine计数应为list的长度(,如果代码继续。

我下面的示例似乎没有将strReceiver通道的值附加到str上,因为Str从未被修改。

有人知道怎么了吗?

func appendToStr(str string, list []string, origin *url.URL) {
    var currProc int32 = 0;
    var maxProc int32 = int32(len(list))
    var strReceiver := make(chan string, len(list))
    for _, item := range list {
        go func() {
            doAsyncAndIncrement(item, strReceiver, &currProc)
            str += <-strReceiver 
        }()
    }
    for {
        if atomic.LoadInt32(&currProc) <= maxProc {
            break;
        }
    }
    // continue on using 'str' which now contains the append values from the 'strReceiver' channel
}
func doAsyncAndIncrement(item string, receiver chan<- string, count *int32) {
    defer atomic.AddInt32(count, 1)
    var val string
    // do something with 'item' and set 'val'...
    receiver <- val
}

您代码的一个问题是,围绕您的GO例程调用太大了。

for _, item := range list {
    go func() {
        doAsyncAndIncrement(item, strReceiver, &currProc)
        str += <-strReceiver 
    }()
}

item范围范围内的循环,而不是goroutine中的匿名函数,因此,当您启动n goroutines时,您的 item变量同时正在以for循环中更新。要解决此问题,请将变量明确地传递给您的goroutine,以免使用闭合:

for _, item := range list {
    go func(item string) {
        doAsyncAndIncrement(item, strReceiver, &currProc)
        str += <-strReceiver 
    }(item)
}

最新更新