Основы синтаксиса Строки и руны Массивы и слайсы Map Структуры и методы Интерфейсы Горутины и конкурентность Каналы defer, panic, recover Обработка ошибок Указатели Пакет sync Тестирование Пакеты и модули Стандартная библиотека Context Generics iota и перечисления Разное / продвинутое

Массивы и слайсы

10 вопросов

Слайсы - основная структура данных для работы с коллекциями в Go. Важно понимать их внутреннее устройство (указатель + длина + ёмкость) и отличие от массивов.

1 Какой результат: var s []int; fmt.Println(s == nil)? 🟢 Лёгкий
Ответ: A) true

Неинициализированный слайс имеет zero value nil. nil-слайс можно использовать с len() (вернёт 0), cap() (вернёт 0) и append() без ошибок. Но make([]int, 0) создаёт пустой не-nil слайс.

Подробнее →
2 Что вернёт cap(make([]int, 3, 10))? 🟢 Лёгкий
Ответ: B) 10

make([]int, length, capacity) - второй аргумент задаёт длину, третий - ёмкость. cap() возвращает ёмкость (10), len() - длину (3). Ёмкость определяет, сколько элементов можно добавить без переаллокации.

Подробнее →
3 Чем массив отличается от слайса? 🟢 Лёгкий
Ответ: B) Массив имеет фиксированный размер

Массив [3]int - фиксированный размер, часть типа. [3]int и [4]int - разные типы. Слайс []int - динамический, это ссылка на массив (указатель + длина + ёмкость). Массивы передаются по значению, слайсы - по ссылке.

Подробнее →
4 Что произойдёт: a := [3]int{1,2,3}; b := a; b[0] = 99; fmt.Println(a[0])? 🟡 Средний
Ответ: B) 1

Массивы в Go - value types. Присваивание b := a создаёт полную копию. Изменение b[0] не затрагивает a. Это ключевое отличие от слайсов, которые разделяют базовый массив.

Подробнее →
5 Что делает append(s, 1, 2, 3)? 🟡 Средний
Ответ: B) Возвращает новый слайс

append не изменяет оригинальный слайс - он возвращает новый. Если ёмкости хватает, новый слайс ссылается на тот же массив. Если нет - Go аллоцирует новый массив побольше. Всегда используйте: s = append(s, ...).

Подробнее →
6 Как скопировать слайс? 🟢 Лёгкий
Ответ: B) copy(b, a)

Функция copy(dst, src) копирует элементы из src в dst, возвращая количество скопированных элементов. b = a - это не копирование, а создание второй ссылки на тот же массив.

Подробнее →
7 Что вернёт len(make([]int, 5, 10))? 🟢 Лёгкий
Ответ: B) 5

make([]int, 5, 10) создаёт слайс длиной 5 и ёмкостью 10. len() возвращает длину (количество доступных элементов), а не ёмкость. Элементы 0–4 инициализированы нулями.

Подробнее →
8 Как удалить элемент из слайса по индексу i? 🟡 Средний
Ответ: C) append(s[:i], s[i+1:]...)

В Go нет встроенной функции удаления из слайса. Идиоматический способ - склеить части до и после удаляемого элемента через append. delete() работает только с map.

Подробнее →
9 Что произойдёт при s := []int{1,2,3}; s2 := s[1:]; s2[0] = 99? 🔴 Сложный
Ответ: B) s[1] станет 99

Подслайс s[1:] разделяет базовый массив с s. s2[0] и s[1] указывают на один и тот же элемент в памяти. Изменение через s2 видно через s. Чтобы получить независимую копию, используйте copy.

Подробнее →
10 Можно ли сравнивать слайсы оператором ==? 🟡 Средний
Ответ: B) Только с nil

Слайсы нельзя сравнивать между собой через == - это ошибка компиляции. Единственное допустимое сравнение - с nil. Для сравнения содержимого используйте slices.Equal() (Go 1.21+) или цикл.

Подробнее →