Что будет выведено в stdout после запуска кода?
Go Playground
На первый взгляд может показаться, что здесь вывод недетерминирован. На самом деле мы имеем дело с очень тонкой гарантией из стандарта языка Go:
For all the cases in the statement right-hand-side expressions of send statements are evaluated exactly once, in source order, upon entering the "select" statement.
Это означает, что перед попыткой записи в
ch1 и ch2 сперва будут вычислены функции get и getWithPanic, причем в порядке расположения в исходном коде.Таким образом, будет выведено
igoroutine courses, вывод из panic не учитывается, поскольку он пишется в stderr, а не stdout.На практике это означает, что нужно быть готовым к тому, что функция в case может быть вызвана, но её возвращаемые значения и side-эффекты не будут использованы в соответствующей ветке.
