В чем разница слайсов и массивов в Go
Что проверяют
Понимаете ли вы, что слайс это описатель поверх массива, и что из этого следует при передаче в функцию и при append.
Как отвечать
Массив это тип фиксированной длины, и длина часть типа: [3]int и [4]int разные типы. Массив копируется целиком при присваивании и при передаче в функцию.
Слайс это структура из трёх полей: указатель на массив, длина и ёмкость. Копируется сама структура, но указывает она на тот же массив, поэтому изменение элемента видно снаружи:
func zero(s []int) { s[0] = 0 } // изменит массив вызывающегоappend добавляет в пределах ёмкости прямо в исходный массив, а когда ёмкости не хватает, выделяет новый и копирует. Отсюда главная ловушка: после append слайс может ссылаться уже на другой массив, и связь с исходным теряется. Поэтому результат append обязательно присваивают обратно.
Вторая ловушка: подслайс делит массив с родителем. Маленький срез большого массива держит весь массив в памяти, а запись в срез меняет родителя. Если нужна независимая копия, есть copy или slices.Clone.
Где спотыкаются
Говорят «слайс это динамический массив» и на этом останавливаются.
Забывают присвоить результат append и теряют изменения.
Не знают про общий массив у подслайсов и получают неожиданные правки данных.
Путают len и cap и не могут объяснить, зачем задавать ёмкость заранее, хотя это убирает лишние перевыделения.