Контекст имеет тайм-аут 5 миллисекунд, и вы спите в течение 10 миллисекунд до запуска этой строки s.output <-42
.Таким образом, контекст является тайм-аутом в первую очередь, и возникает ошибка, это правильно, но взгляните на main
function:
select {
case o := <-s.output:
fmt.Println("output: ", o)
case err := <-s.errs:
fmt.Println("error: ", err)
}
Оператор select
достиг значения case err := <-s.errs
, поэтому он прервет выбор иперейти к концу main
function => выход из программы. Даже если s.output <- 42
является вызовом одновременно с s.errs <- errors.New("ctx done")
, в операторе select
достигнут только один случай, если вам нужно достичь второго случая, поместите цикл вокруг оператора select