Завтра снова начнём перекладывать байты и писать код, а сегодня решил освежить в памяти, а заодно и рассказать вам про различия массивов в PHP и Go.
Что по памяти?
Сразу отмечу: в PHP нет массивов в привычном смысле. По сути, это мапы (ассоциативные массивы), которые могут использовать числовые и строковые ключи одновременно.
Вот пример:
$array = [
"name" => "Массив",
42 => "или мапа?"
];
echo $array["name"]; // Массив
echo $array[42]; // или мапа?
Даже если явно указать:
$array = [1, 2, 3];
...под капотом это всё равно будет хэш-таблица.
- PHP: Каждый элемент содержит указатели на ключ и значение, а также ссылки для поддержания порядка элементов.
- Go: Массивы — это конкретный непрерывный блок памяти фиксированного размера.
Из-за этого массивы в Go экономичнее в плане памяти, но менее гибкие.
Что по ключам?
- PHP: Числа или строки. Всё остальное автоматически преобразуется (например, bool → 0, true → 1).
- Go (array, slice): В массивах и срезах нет ключей, только числовые индексы.
- Go (map): Ключи должны быть типами, реализующими интерфейс comparable (числа, строки, указатели, структуры с сравнимыми полями).
Что по значениям?
- PHP: Значения могут быть любых типов, включая массивы или объекты (даже в рамках одного массива).
- Go (array, slice): Все значения одного типа, заданного при создании.
- Go (map): Значения могут быть любого типа, включая срезы, структуры и функции, но тип должен быть определён при создании.
Что по итогу?
Если вам нужна гибкость и простота — PHP. Они универсальны, но помните: накладные расходы на память выше из-за их структуры.
Если важна производительность, и вы бьётесь за каждый байт — Go.