Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!08.01.2024
Цілочисельні типи в Go: int проти int64
В Go, як у системній мові програмування, є ціла низка цілочисельних типів з явно заданим розміром: int8, int16, int32, int64
(Є ще типи без знаку - uint8
і так далі — але то зараз не важливо.)
Це на відміну від мов вищого рівня, де розмір числа нами не контролюється. Наприклад, Ruby прозоро перейде на довгу арифметику та готово зберігати числа довільного розміру — без всякого попередження. А в JavaScript, як я вже писав, взагалі “цілих” чисел немає — тільки числа з рухомою комою.
В Go ми вільні обрати те число, яке нам потрібно. Але… також можемо взяти тип int
, який, в залежності від платформи, має розмір 32 або 64 біти. Ми знаходимося посеред довгої епохи 64-бітових чисел. Вони всюди, від телефонів до суперкомпʼютерів. Тому, у 100% практичних випадків, int та int64 це один та той самий фізичний тип.
Коли брати int8
, int16
, та int32
більш-менш зрозуміло: або для відображення зовнішніх значень з чітко заданим розміром, або коли потрібно заощадити на розмірі великого масиву даних. В інших випадках економія не виправдана, бо процесор швидше за все працює зі словами своєї “рідної” довжини, тобто int64
.
Але як щодо int
та int64
? Що краще? Тут є декілька аспектів. Перше — типи все ж не сумісні на синтаксичному рівні та потребують явної конвертації. Друге — константи мають тип int
, змінні, що ними ініціалізовані — теж. Так само len
має тип int
. Третє — офіційний посібник радить вживати int
, якщо немає “особливої причини” на int64
.
Яка то може бути “особлива причина”? На мою думку, так само як з меншими типами, int64 має сенс там, де розмір числа заданий ззовні. Коли ми читаємо (або пишемо) число з бази, чи з файлу, чи отримуємо з інтернету — розмір залежить вже не від нас — значить, int64
правильний вибір.