Что важно знать
- Срез — указатель, длина, ёмкость.
appendможет вернуть новый массив — результат обязательно присваивать.- Порядок обхода мапы случаен; мапа не потокобезопасна.
- Строка — байты, руна — символ Unicode.
Устройство среза, append и общий массив, мапы, строки и руны.
append может вернуть новый массив — результат обязательно присваивать.Практика. Решить 10 задач «что выведет код» на срезы и append.
Практика. Найти и исправить ошибки с общим массивом в учебном коде обработки срезов.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
Срезы, полученные друг из друга, делят базовый массив, пока append не перевыделил его. Если у исходного среза есть свободная ёмкость, append к подсрезу перезапишет элементы исходного. Поведение зависит от cap — поэтому баг проявляется не всегда.
Полный разборМассив [5]int — значение фиксированного размера, размер — часть типа ([3]int и [4]int — разные типы); присваивание и передача копируют все элементы. Срез []int — дескриптор над массивом с переменной длиной; копирование дешёвое, данные общие.
Полный разборnew(T) выделяет нулевое значение любого типа и возвращает указатель T. make — только для срезов, мап и каналов: инициализирует их внутреннюю структуру и возвращает само значение (не указатель), готовое к работе.
Полный разборmap — хеш-таблица: вставка, поиск и удаление в среднем O(1). Порядок обхода случаен и намеренно перемешивается от запуска к запуску. Конкурентная запись из нескольких горутин — фатальная ошибка «concurrent map writes»: нужен Mutex или sync.Map.
Полный разборnil-срез (var s []int) и пустой ([]int{}) оба имеют len 0, с обоими работают range и append. Различие — только s == nil и JSON: nil кодируется как null, пустой — как []. nil-map можно читать (нулевое значение), но запись — panic: у неё нет хеш-таблицы, куда…
Полный разборСрез — дескриптор из трёх полей: указатель на базовый массив, длина (len — сколько элементов доступно) и ёмкость (cap — сколько поместится до конца массива). append пишет в тот же массив, пока хватает ёмкости; иначе выделяет новый массив большего размера и…
Полный разборСтрока — неизменяемая последовательность байт, обычно в UTF-8. len возвращает число байт, а не символов: кириллица занимает 2 байта, поэтому len("привет") == 12. Руна (rune = int32) — код символа Unicode. for range по строке идёт по рунам, индекс s[i] — по…
Полный разборПосле собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.