Передаются ли слайсы в Go по значению или по ссылке?

Слайс в Go представляет собой структуру из трёх полей: указателя на массив, длины и ёмкости. Он передаётся как значение: копируется структура слайса, а не весь массив. При таком копировании указатель остаётся тем же,…

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

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

Слайс в Go представляет собой структуру из трёх полей: указателя на массив, длины и ёмкости. Он передаётся как значение: копируется структура слайса, а не весь массив. При таком копировании указатель остаётся тем же, поэтому оба экземпляра обращаются к одним и тем же изменяемым данным. Если внутри функции изменить элементы слайса, эти изменения будут видны и за её пределами. При этом изменение длины или ёмкости копии слайса не меняет соответствующие параметры оригинала. Такой подход сочетает высокую производительность с гибкостью работы со слайсами. Практический смысл заключается в том, что большие объёмы данных можно передавать без…

Подробный разбор

Ответ с пояснениями

Передаются ли слайсы в Go по значению или по ссылке?

  • Слайс в Go представляет собой структуру из трёх полей: указателя на массив, длины и ёмкости.
  • Он передаётся как значение: копируется структура слайса, а не весь массив.
  • При таком копировании указатель остаётся тем же, поэтому оба экземпляра обращаются к одним и тем же изменяемым данным.
  • Если внутри функции изменить элементы слайса, эти изменения будут видны и за её пределами.
  • При этом изменение длины или ёмкости копии слайса не меняет соответствующие параметры оригинала.
  • Такой подход сочетает высокую производительность с гибкостью работы со слайсами.
  • Практический смысл заключается в том, что большие объёмы данных можно передавать без копирования, однако необходимо учитывать изменения содержимого и структуры слайса.

Развёрнутый ответ

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

В Go слайсы передаются по значению: копируется их структура (header), но не сами данные, на которые она ссылается. В структуру слайса входят указатель на underlying array, длина и ёмкость. Поэтому при передаче слайса в функцию создаётся копия только небольшого header, тогда как весь массив не дублируется.

Что важно помнить

  • Слайс в Go является оболочкой над массивом и хранит указатель на данные, длину и ёмкость.
  • Передача слайса по значению создаёт копию его структуры, но сами элементы остаются единственными экземплярами в памяти и доступны через общий указатель.
  • Изменение элементов слайса в функции затрагивает исходный массив. Однако изменение самой структуры слайса, например присваивание нового слайса, не изменяет слайс в вызывающей функции.

Практическое применение

Благодаря этому механизму можно работать с подмножествами массивов без копирования больших объёмов данных и тем самым уменьшать накладные расходы. Например, в Go 1.18+ такой подход активно используется в generic-функциях, где слайсы передаются для эффективного доступа к данным и их мутабельности.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку