РЕДАКТИРОВАТЬ: Я написал этот ответ на скорую руку, прежде чем понять, что ваш вопрос о отправке значений Чан внутри Goroutine.Приведенный ниже подход может быть использован либо с дополнительным каналом, как предложено выше, либо с использованием того факта, что у вас уже есть двунаправленный канал, вы можете использовать только один ...
Если вашgoroutine существует исключительно для обработки элементов, поступающих из чана, вы можете использовать встроенную функцию «close» и специальную форму приема для каналов.
То есть, как только вы закончите отправку элементов в чанеЗакрой это.Затем внутри вашей программы вы получаете дополнительный параметр для оператора приема, который показывает, был ли канал закрыт.
Вот полный пример (группа ожидания используется, чтобы убедиться, что процесс продолжается до тех пор, пока программа не завершится):
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
ch := make(chan int)
go func() {
for {
foo, ok := <- ch
if !ok {
println("done")
wg.Done()
return
}
println(foo)
}
}()
ch <- 1
ch <- 2
ch <- 3
close(ch)
wg.Wait()
}