Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: channel, close, panic, recover, concurrency

Что будет, если попытаться писать в закрытом канале?

Этот вопрос проверяет знание работы с каналами, одной из ключевых особенностей Go, и демонстрирует, как обрабатывать ошибки при работе с ними.

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

Попытка записи в закрытый канал вызовет панику (runtime panic). Это связано с тем, что закрытый канал не может принимать новые данные. Чтобы избежать этого, нужно проверять состояние канала перед записью или использовать механизм восстановления после паники (recover).

Длинный ответ

1. Как работают закрытые каналы:

  • Канал можно закрыть с помощью функции close(). После этого:

  • Данные больше не могут быть записаны в канал.

  • Чтение из канала возвращает оставшиеся элементы, а затем значение по умолчанию.

2. Пример кода с записью в закрытый канал:

package main

import "fmt"

func main() {
    	ch := make(chan int, 1)
    	ch <- 42
    	close(ch)

    	// Попытка записи в закрытый канал
    	ch <- 100 // PANIC: отправка в закрытый канал
}

3. Как избежать ошибки:
Перед записью можно использовать блокировку и синхронизацию, чтобы убедиться, что канал не закрыт.

package main

import "fmt"

func safeSend(ch chan int, value int) {
    	defer func() {
        	if r := recover(); r != nil {
            		fmt.Println("Паника обработана:", r)
        	}
    	}()

    	ch <- value
}

func main() {
    	ch := make(chan int, 1)
    	close(ch)

    	safeSend(ch, 42) // Паника обработана: отправка в закрытый канал
}

4. В каких случаях использовать:

  • Для синхронизации горутин, где важна контрольная обработка данных через каналы.

  • Если важно избежать гонок данных при завершении горутин.

  • При проектировании систем с высокой конкуренцией, где канал может быть закрыт в произвольный момент.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    8

Навыки

  • Golang

    Golang

Ключевые слова

#channel

#close

#panic

#recover

#concurrency

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.