Ответ
Доступ к элементу массива в Go имеет временную сложность O(1) (константное время).
Это означает, что время, необходимое для чтения элемента, не зависит от размера массива. Это достигается благодаря тому, что компилятор может вычислить точный адрес элемента в памяти по его индексу, используя простую формулу:
адрес_элемента = адрес_начала_массива + индекс * размер_элемента
Это одна из самых быстрых операций с памятью.
// Размер массива не влияет на скорость доступа
arr := [1000000]int{1, 2, 3, ...}
// Обе операции выполняются практически мгновенно
firstVal := arr[0]
lastVal := arr[999999]
Ключевые особенности, связанные с массивами в Go:
- Фиксированный размер: Размер массива является частью его типа (
[4]int
и[5]int
— это разные типы). Это отличает его от среза (slice
). - Передача по значению: При передаче массива в функцию создается его полная копия. Для больших массивов это может быть неэффективно. Чтобы избежать копирования, следует передавать указатель на массив (
*[N]T
). - Безопасность: Попытка доступа к элементу за пределами массива вызывает панику времени выполнения (
panic: runtime error: index out of range
), что предотвращает повреждение памяти.