У меня есть два канала, восходящий и нисходящий. Моя цель - прочитать данные из восходящего потока и передать их в нижестоящий поток. Однако, когда контекст отменен, я хотел бы выйти изящно без тупика.
Я пытался быть "умным" и сделал что-то вроде следующего.
func main() {
upstream := make(chan struct{})
ctx, cancel := context.WithCancel(context.Background())
go func() {
<-time.After(5 * time.Second)
cancel()
}()
// Buffered downstream ensures no blocking in this scenario
downstream := make(chan struct{}, 1)
select {
case <-ctx.Done():
log.Println("context is killed")
case downstream <- <-upstream:
log.Println("transferred value from upstream to downstream")
}
}
Тогда я зашел в тупик. Однако, если я перестану быть ленивым и сделаю следующее,
func main() {
upstream := make(chan struct{})
ctx, cancel := context.WithCancel(context.Background())
go func() {
<-time.After(5 * time.Second)
cancel()
}()
// Buffered downstream ensures no blocking in this scenario
downstream := make(chan struct{}, 1)
select {
case <-ctx.Done():
log.Println("context is killed")
case val := <-upstream:
downstream <-val
log.Println("transferred value from upstream to downstream")
}
}
Она вышла прекрасно, без тупика. Подскажите, пожалуйста, в чем ключевое отличие между
downstream <- <-upstream
и
val := <-upstream
downstream <-val