Процессор читает память блоками (4 или 8 байт). Если переменная не выровнена по границе — доступ медленнее или вообще невозможен (на некоторых архитектурах).
Go автоматически добавляет padding между полями структуры:
// Плохо: 24 байта (padding между полями)
type Bad struct {
a bool // 1 байт + 7 padding
b int64 // 8 байт
c bool // 1 байт + 7 padding
}
// Хорошо: 16 байт (поля отсортированы по размеру)
type Good struct {
b int64 // 8 байт
a bool // 1 байт
c bool // 1 байт + 6 padding
}
Проверка:
fmt.Println(unsafe.Sizeof(Bad{})) // 24
fmt.Println(unsafe.Sizeof(Good{})) // 16
Правило: сортируй поля от большего к меньшему. Инструмент fieldalignment (часть go vet) автоматически находит неоптимальные структуры:
go vet -fieldalignment ./...
На практике важно только для структур, создаваемых миллионами (кеши, буферы, частицы). Для обычных бизнес-объектов — не парься.