按顺序读取golang通道

按顺序读取golang通道,go,parallel-processing,channel,Go,Parallel Processing,Channel,我试图在go中通过通道实现并行处理和通信 我基本上试图解决的是并行处理一个特定的数据,并按照order=>Imported-type-Chunk的顺序获得结果,如下所示 我只是为每个块处理创建一个新通道,并将它们保存在slice=>中,之后迭代它们之后,它们将被排序 我的程序的简化版本是: 然而,我希望看到的是: [STDOUT] from: 0 to: 2 [STDOUT] from: 2 to: 4 我做错了什么?我看不出来。问题出在main的第一个for循环中。当您使用for range

我试图在go中通过通道实现并行处理和通信

我基本上试图解决的是并行处理一个特定的数据,并按照order=>Imported-type-Chunk的顺序获得结果,如下所示

我只是为每个块处理创建一个新通道,并将它们保存在slice=>中,之后迭代它们之后,它们将被排序

我的程序的简化版本是:

然而,我希望看到的是:

[STDOUT] from: 0 to: 2
[STDOUT] from: 2 to: 4

我做错了什么?我看不出来。

问题出在main的第一个for循环中。当您使用for range循环时,循环变量块在这里创建一次,并在每次迭代中为每个slice元素分配一个副本

调用processChunk&chunk时,传递的是该循环变量的地址,该变量的值随每次迭代而变化。因此,函数processChunk总是处理chunks循环中的最后一项,因为在for循环完成后,*chunk指向该项

要修复此问题,请使用切片索引:

for i := 0; i < len(chunks); i++ {
    // pass chunk objects by indexing chunks
    outChannels = append(outChannels, processChunk(&chunks[i]))
}
固定代码:


您可以阅读有关范围的更多信息。

问题出在main的第一个for循环中。当您使用for range循环时,循环变量块在这里创建一次,并在每次迭代中为每个slice元素分配一个副本

调用processChunk&chunk时,传递的是该循环变量的地址,该变量的值随每次迭代而变化。因此,函数processChunk总是处理chunks循环中的最后一项,因为在for循环完成后,*chunk指向该项

要修复此问题,请使用切片索引:

for i := 0; i < len(chunks); i++ {
    // pass chunk objects by indexing chunks
    outChannels = append(outChannels, processChunk(&chunks[i]))
}
固定代码:

您可以阅读更多有关范围的信息

for i := 0; i < len(chunks); i++ {
    // pass chunk objects by indexing chunks
    outChannels = append(outChannels, processChunk(&chunks[i]))
}