如何从通道接收直到它在 GO 中具有值
How to receive from channel till it has values in GO
一个函数有一个循环,它在其中调用一个 go 例程,并向其中传递一个通道。
在此之后,我尝试从频道接收直到它有值。
go 函数在每次调用时在通道中传递值。
我的频道无限运行。
func (m *StreamsDAO) FindOutput(输入model.Input) ([]model.Output, 错误) {
// 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)
}
它无限循环,因为没有停止从频道接收。
如果使用关闭通道,则仅按预期从通道接收到单个元素,但我需要通道中的所有值。
终于使用 WaitGroup 找到了答案。分享link完整参考:
https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/
一个函数有一个循环,它在其中调用一个 go 例程,并向其中传递一个通道。 在此之后,我尝试从频道接收直到它有值。
go 函数在每次调用时在通道中传递值。
我的频道无限运行。
func (m *StreamsDAO) FindOutput(输入model.Input) ([]model.Output, 错误) {
// 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)
}
它无限循环,因为没有停止从频道接收。 如果使用关闭通道,则仅按预期从通道接收到单个元素,但我需要通道中的所有值。
终于使用 WaitGroup 找到了答案。分享link完整参考: https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/