Ответ
Операции со слайсами в Go имеют разную сложность:
- Доступ по индексу (slice[i]): O(1) – константное время
- Добавление (append):
- O(1) – если есть место в capacity
- O(n) – при реаллокации (копирование всех элементов)
- Копирование (copy): O(n) – линейное время
- Срез (slice[a:b]): O(1) – создает новый заголовок слайса
- Итерирование (range): O(n) – зависит от длины слайса
Пример с append:
s := make([]int, 0, 3) // O(1)
s = append(s, 1) // O(1) – есть capacity
s = append(s, 2, 3, 4) // O(n) – реаллокация
При работе со слайсами важно учитывать возможные реаллокации при append, которые могут существенно повлиять на производительность.