Фиксированные целые числа
Фиксированные целые числа требуют точного объема памяти. Используя меньший целочисленный тип «здесь и там» для отдельных переменных, вы получите только небольшой объем памяти, если таковой имеется. Также при использовании в качестве типов структурных полей вы снова можете ничего не получить из-за неявных заполнений.
Увеличение памяти может быть заметным и значительным, если вы используете целые числа фиксированного размера в качестве типа элементов (больших) срезов или массивов.
Другая (возможно, более важная) причина использования целых чисел фиксированного размера может заключаться в сообщении того, что вы в них храните. С таким же успехом вы можете использовать тип int32
или int64
для хранения байтов, но, будучи очевидной тратой, они не передают допустимый диапазон данных, хранящихся в них.
Еще один момент - это эффективность. Вы всегда можете использовать int64
вместо других целочисленных типов со знаком, но на некоторых архитектурах выполнение операций на int64
может потребовать нескольких операций с регистрами и, следовательно, значительно медленнее. Также тип rune
(псевдоним для int32
) четко указывает, что вы собираетесь использовать его для кодовых точек Юникода.
Еще один момент - последовательность. Если вы используете int32
для моделирования чего-либо в одном месте, вы должны придерживаться этого и везде использовать один и тот же тип. Это более важно в Go, чем в других языках, потому что система типов Go является строгой (более строгой, чем в большинстве других языков), то есть, если у вас есть значение типа int32
, вы не можете присвоить его переменной int64
тип и наоборот без явного преобразования.
int
против целых чисел фиксированного размера
Типы int
и uint
не являются фиксированными размерами, но соответствуют Спецификация: Числовые типы:
uint either 32 or 64 bits
int same size as uint
Когда вы используете int
, компилятор может создавать более оптимизированный код, ориентируясь на разные архитектуры. Обычно int
является 32-разрядным при нацеливании на 32-разрядные архитектуры и 64-разрядным при нацеливании на 64-разрядные архитектуры. Это означает, что размер int
будет соответствовать размеру регистра целевой архитектуры, поэтому целочисленные операции можно эффективно выполнять с помощью операций с одним регистром. Например, если вы используете int64
, это может потребовать выполнения нескольких (регистровых) операций для выполнения одной целочисленной операции в 32-разрядной архитектуре.
Мне нравится думать, что int
является целочисленным типом, который используется для описания и передачи определенных частей или компонентов структур данных времени выполнения Go в наилучшем виде, который он считает подходящим. Например, для индексирования массивов или фрагментов или для описания их размеров int
- это «естественный» тип для использования.
Спецификация: длина и емкость:
Встроенные функции len
и cap
принимают аргументы различных типов и возвращают результат типа int
. Реализация гарантирует, что результат всегда вписывается в int
. Например, для индексирования фрагментов или массива или для описания их длины и емкости int
- это «естественный» тип, рекомендуемый или применяемый.
При использовании оператора for range
с хотя бы одной переменной итерации для массивов, срезов или значений string
переменная итерации («индекс») будет иметь тип int
.
Также обратите внимание, что Роб Пайк представил предложение для Go 2 об изменении int
на произвольную точность. предложение: spec: изменить int на произвольную точность