【发布时间】:2019-09-13 16:16:40
【问题描述】:
一个函数有一个循环,它在它内部调用一个 go 例程,并传递一个通道。 在此之后,我尝试从通道接收直到它有值。
go 函数在每次调用时在通道中传递值。
我的频道无限运行。
func (m *StreamsDAO) FindOutput(input model.Input) ([]model.Output, error) {
// SOME CODE
var chanNumber int = (input.EndTime - input.StartTime)/60
outputChan := make(chan model.Output, chanNumber)
for i := input.StartTime; i < input.EndTime ;i = i+(slider*60) {
// SOME CODE
go ForEachSlide(i, outputChan)
for outputC := range outputChan {
outputs = append(outputs, outputC)
}
}
return outputs, err
}
func ForEachSlide(i int, outputChan chan model.Output) {
// SOME CODE
outputChan <- output
// close(outputChan)
}
它无限循环,因为从频道接收没有停止。 如果使用关闭通道,则只会从通道接收单个元素,这与预期的一样,但我需要通道中的所有值。
【问题讨论】:
-
通道上的
for range构造接收关闭之前在其上发送的所有值。然后在通道关闭时终止。 -
我猜这里的范围没有终止。如果我取消注释 close(outputChan),它将不允许接收所有值。
-
for range在收到所有在通道关闭之前发送的值时终止。如果通道没有关闭,它不会终止。 -
是的,这就是我要问的,我无法在第二个函数结束时关闭频道。由于这是缓冲通道,因此我希望它具有更多价值。
for range这里没有终止,因为它期望通道中有更多的值。我希望解决这个问题,一旦通道中的所有值都被消耗,for range应该终止或其他一些可以做类似事情的方法。 -
如果要发送更多的值,请不要关闭它;但是如果你发送更多的值,你也不希望消费者停止循环,所以看起来一切都在正常工作。您正在寻找的具体行为是什么?