В Go есть bool; целочисленные int, uint, типы фиксированной ширины и uintptr; float32/64; complex64/128; string. Также используются массивы, срезы, map, struct, указатели, функции, интерфейсы и каналы. byte — псевдоним uint8, rune — int32. Строка неизменяема и содержит байты, не обязательно корректный UTF-8. uintptr является целым числом, а не обычным указателем.
Перечислите основные типы данных в Go.
Базовые и составные типы Go, псевдонимы byte и rune, назначение uintptr и отличие строки байтов от гарантированно корректного текста UTF-8.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Типы удобно перечислять по группам, а затем пояснить несколько важных различий.
Базовые типы:
boolсо значениямиtrueиfalse;- знаковые целые
int,int8,int16,int32,int64; - беззнаковые
uint,uint8,uint16,uint32,uint64,uintptr; - вещественные
float32,float64; - комплексные
complex64,complex128; - строки
string.
Размер int и uint зависит от реализации и составляет 32 или 64 бита. byte — псевдоним uint8, а rune — псевдоним int32, обычно используемый для кодовых точек Unicode. Это не отдельные новые типы. Правила определены в спецификации Go.
Составные и другие категории включают массивы [N]T, срезы []T, отображения map[K]V, структуры struct, указатели *T, функции func(T) R, интерфейсы и каналы chan T. У каналов можно ограничить направление передачи. Функции являются значениями: их можно сохранять в переменных и передавать аргументами.
Массив имеет длину, входящую в его тип. Срез описывает участок базового массива; это не просто массив без указанной длины. Интерфейс задаёт допустимые операции, а any является псевдонимом пустого интерфейса.
Две частые ловушки: string — неизменяемая последовательность произвольных байтов, не обязательно корректный UTF-8; len(s) считает байты. Это разобрано в материале Go о строках. А uintptr может хранить числовое представление адреса и сам по себе не удерживает объект от сборки мусора; см. документацию unsafe.