Memory alignment — это требование процессора, чтобы данные лежали по адресам, кратным их размеру. int64 должен быть по адресу, кратному 8, int32 — кратному 4. Если нарушить — на некоторых архитектурах будет краш, на x86 — просто медленнее.
Go компилятор автоматически выравнивает поля структур, добавляя padding (пустые байты). Из-за этого порядок полей влияет на размер структуры.
type Bad struct {
a bool // 1 байт + 7 padding
b int64 // 8 байт
c bool // 1 байт + 7 padding
} // итого: 24 байта
type Good struct {
b int64 // 8 байт
a bool // 1 байт
c bool // 1 байт + 6 padding
} // итого: 16 байта
Проверить можно через unsafe.Sizeof() и unsafe.Alignof(). Линтер fieldalignment из govet подсказывает оптимальный порядок полей. На практике это важно, когда у тебя миллионы структур в памяти — экономия 8 байт на структуру даёт мегабайты.