Функция имеет цикл, который вызывает процедуру go внутри нее с переданным в нее каналом. После этого я пытаюсь получить от канала, пока он не имеет значений.
Функция go передает значение в канал при каждом вызове.
Мой канал работает бесконечно.
func (m *StreamsDAO) FindOutput (входная модель. Ввод) ([] модель. Вывод, ошибка) {
// 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)
}
Его зацикливание бесконечно, так как нет остановки для приема из канала. Если используется закрытый канал, из канала будет получен только один элемент, как и ожидалось, но мне нужны все значения из канала.
Здесь это для диапазона не заканчивается, я думаю. Если я раскомментирую close(outputChan), это не позволит получить все значения.
for range
завершается, когда получены все значения, которые были отправлены до закрытия канала. Если канал не закрыт, он не завершится.
Да, вот что я спрашиваю, я не могу закрыть канал в конце второй функции. Поскольку это буферизованный канал, я хочу получить от него больше пользы. for range
здесь не завершается, так как ожидается больше значений в канале. Я хочу, чтобы эта проблема была решена, как только все значения из канала будут использованы, for range
должен завершиться или какой-либо другой метод, который может сделать подобное.
Если вы хотите отправить больше значений, не закрывайте его; но если вы отправляете больше значений, вы также не хотите, чтобы потребитель прекратил цикл, поэтому кажется, что все работает как надо. Какое именно поведение вы ищете?
Нет, я думаю, что когда я не закрываюсь, это означает, что он не останавливается для приема с канала, и он застревает там навсегда. Его следует остановить, когда все предметы из канала будут израсходованы, тогда можно будет активировать только return
.
for range
останавливается, если канал был закрыт и все значения получены. Пожалуйста, покажите минимальный воспроизводимый пример, который воспроизводит вашу проблему, без этого ваш вопрос не по теме.
Наконец-то получил ответ, используя WaitGroup. Ссылка для полного ознакомления: https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/
Конструкция
for range
над каналом получает все значения, которые были отправлены по нему до закрытия. Затем он прекращается, когда канал закрывается.