Почему у slice может быть скорость O(1)

«Почему у slice может быть скорость O(1)» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Срез (slice) в Go имеет O(1) для операций доступа и изменения элементов, потому что это просто обёртка над массивом с указателем на начало, длиной и ёмкостью. Доступ по индексу — это арифметика указателей: ptr + index * element_size.

Однако, операции вроде append могут быть O(n) при переаллокации, если не хватает capacity.

Пример:

s := make([]int, 0, 5) // O(1) - выделение памяти
s = append(s, 42)     // O(1) - просто запись
val := s[0]           // O(1) - доступ