【问题标题】:How to receive from channel till it has values in GO如何从通道接收直到它在 GO 中有值
【发布时间】: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 应该终止或其他一些可以做类似事情的方法。
  • 如果要发送更多的值,请不要关闭它;但是如果你发送更多的值,你也不希望消费者停止循环,所以看起来一切都在正常工作。您正在寻找的具体行为是什么?

标签: go channel goroutine


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多