Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: slice, go, race

Почему в Go нельзя безопасно читать и писать в один slice из разных goroutine без синхронизации?

Проверяет понимание конкурентного доступа к памяти, data race и внутреннего устройства slice.

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

Slice в Go не потокобезопасен. Если одна goroutine читает, а другая изменяет slice одновременно, возникает data race. Это может привести к повреждению данных или panic.

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

Slice в Go - это структура, состоящая из трёх частей:

  • pointer на массив

  • length

  • capacity

Если одна goroutine изменяет slice, например через append, возможны два сценария:

  • данные записываются в существующий массив

  • runtime выделяет новый массив и копирует данные

Если другая goroutine в это время читает slice, она может:

  • читать старый массив

  • читать частично обновлённые данные

  • читать уже освобождённую память

Это приводит к data race и неопределённому поведению.

Пример проблемы:

var s []int

go func() {
		s = append(s, 1)
}()

go func() {
		fmt.Println(len(s))
}()

Чтобы избежать проблемы используют:

  • sync.Mutex

  • sync.RWMutex

  • каналы

  • копирование slice

Пример безопасного варианта:

var mu sync.Mutex

mu.Lock()
s = append(s, 1)
mu.Unlock()
  • Аватар

    Golang Guru

    Maxim Lukyanov

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Golang

    Golang

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

#slice

#go

#race

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

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