Какой размер переменной var в Go: 32 или 64 бита
Что проверяют
Понимаете ли вы, что var это ключевое слово для объявления, а не тип, и размер задаёт тип переменной. Вопрос с подвохом: ждут не «64», а «зависит от типа, а у int ещё и от платформы». Следом обычно спрашивают, какой тип получит var x = 10 и как узнать размер в программе.
Как отвечать
Разложите ответ по шагам:
varне определяет размер:var x int32всегда 4 байта,var y int64всегда 8,var s stringзанимает заголовок из указателя и длины;- тип по умолчанию: в
var x = 10нетипизированная константа получает типint, вvar f = 1.5типfloat64, вvar r = 'a'типrune, то естьint32; - платформенные типы:
int,uintиuintptrзанимают 32 бита наGOARCH=386иarmи 64 бита наamd64иarm64. Почти весь прод сейчас 64-битный, поэтому на практикеintзанимает 8 байт; - фиксированные типы:
int8,int16,int32,int64,float32,float64, аbyteэто синонимuint8; - проверка:
unsafe.Sizeof(x)возвращает размер в байтах,strconv.IntSizeдаёт разрядностьint,math.MaxIntего максимум.
Где это важно на практике: в бинарных форматах, сетевых протоколах и в cgo берут фиксированные типы, иначе раскладка структуры будет разной на разных платформах. Для индексов и длин используют int, потому что именно его возвращает len, а лишние преобразования типов только засоряют код.
Где спотыкаются
Отвечают «64 бита» без оговорок, путая var с типом. Интервьюер сразу видит, что объявление и тип для вас одно и то же.
Думают, что размер string зависит от длины строки. unsafe.Sizeof показывает только заголовок: 16 байт на 64-битной платформе и 8 на 32-битной, а сами байты лежат отдельно.
Не знают, что бывает при переполнении. В рантайме арифметика целых молча заворачивается: если x типа int32 равен math.MaxInt32, то x + 1 даёт math.MinInt32. А переполнение константы ловится на компиляции: var b int8 = 200 не соберётся.