Ответ
Заголовок слайса в Go — это структура, которая сама по себе занимает фиксированный объем памяти, не зависящий от количества элементов в слайсе. Размер зависит от архитектуры процессора:
- 24 байта на 64-битной архитектуре (3 поля по 8 байт).
- 12 байт на 32-битной архитектуре (3 поля по 4 байта).
Эта структура определена в рантайме Go и содержит три поля:
// Фактическое определение в пакете runtime
type slice struct {
array unsafe.Pointer // Указатель на нижележащий массив данных
len int // Текущее количество элементов в слайсе
cap int // Емкость (capacity) нижележащего массива
}
Проверить это можно с помощью пакета unsafe
:
package main
import (
"fmt"
"unsafe"
)
func main() {
s := make([]int, 0, 10)
fmt.Printf("Размер заголовка слайса: %d байтn", unsafe.Sizeof(s))
// Вывод на 64-битной системе: 24 байт
}
Важно: unsafe.Sizeof(s)
возвращает размер только самой структуры-заголовка, а не память, выделенную для данных, на которые он указывает. Память для элементов слайса (cap
* размер_элемента
) выделяется отдельно в куче.