Размеры заголовков основных типов на 64-bit платформе:
// slice header (reflect.SliceHeader): 24 байт
type SliceHeader struct {
Data uintptr // 8 байт - указатель на backing array
Len int // 8 байт
Cap int // 8 байт
}
// string header (reflect.StringHeader): 16 байт
type StringHeader struct {
Data uintptr // 8 байт - указатель на байты
Len int // 8 байт
}
// interface (runtime.iface): 16 байт
type iface struct {
tab *itab // 8 байт - указатель на таблицу методов + тип
data unsafe.Pointer // 8 байт - указатель на данные
}
// Другие типы:
// int, uint, uintptr, pointer: 8 байт
// bool: 1 байт
// struct{}: 0 байт
// map: 8 байт (это указатель на runtime.hmap)
// chan: 8 байт (указатель на runtime.hchan)
// func: 8 байт (указатель)
Знание размеров важно для оценки потребления памяти: []string из 1 млн элементов занимает 24 + 1M*16 = ~16 МБ только на заголовки строк, без учета самих данных.