После двух чтений выберется одна из веток select, напечатает close by ok 1 или close by ok 2 и вызовет panic из-за повторного close. Ветка default не выполнится.
Какой текст появится в консоли при запуске программы №67
После двух чтений выберется одна из веток select, напечатает close by ok 1 или close by ok 2 и вызовет panic из-за повторного close. Ветка default не выполнится.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вопрос: какой вывод будет получен после выполнения следующей Go‑программы? Обратите внимание на работу буферизированного канала, операции чтения, закрытия канала и конструкции select.
import (
"fmt"
)
func main() {
soundQueue := make(chan int, 1000)
soundQueue <- 1
soundQueue <- 2
soundQueue <- 3
soundQueue <- 4
soundQueue <- 5
value1, present1 := <-soundQueue
fmt.Println("%v %v \n", value1, present1)
close(soundQueue)
value2, present2 := <-soundQueue
fmt.Printf("%v %v \n", value2, present2)
select {
case _, ok := <-soundQueue:
if ok {
fmt.Println("close by ok 1")
close(soundQueue)
}
case _, ok := <-soundQueue:
if ok {
fmt.Println("close by ok 2")
close(soundQueue)
}
default:
fmt.Println("close by Default")
close(soundQueue)
}
}
Ответ
После двух чтений выберется одна из веток select, напечатает close by ok 1 или close by ok 2 и вызовет panic из-за повторного close. Ветка default не выполнится.
Первое чтение возвращает 1,true, но Println печатает %v %v буквально вместе с содержащимся в строке переводом строки. Второе чтение через Printf выводит 2 true. Закрытие не удаляет буфер: select читает 3 с ok=true, затем повторно закрывает уже закрытый канал. ok означает получение значения, а не разрешение ещё раз вызвать close.