Какой текст появится в консоли при запуске программы №67

После двух чтений выберется одна из веток select, напечатает close by ok 1 или close by ok 2 и вызовет panic из-за повторного close. Ветка default не выполнится.

Короткий ответ

Что ответить на собеседовании

После двух чтений выберется одна из веток 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее