Какие базовые типы есть в Go
Что проверяют
Знаете ли вы набор типов и понимаете ли особенности строк и целых.
Как отвечать
Логический: bool.
Целые: со знаком int8, int16, int32, int64 и без знака uint8, uint16, uint32, uint64, плюс uintptr. Отдельно int и uint, чей размер зависит от платформы и на современных системах равен 64 битам. Есть два важных псевдонима: byte это uint8, а rune это int32 и обозначает кодовую точку Unicode.
С плавающей точкой: float32 и float64. Комплексные: complex64 и complex128.
Строка: string.
Особенности, которые и хотят услышать:
- нет неявных преобразований. Сложить
intиint64нельзя, нужно явное приведение. Многословно, зато исключает скрытые ошибки переполнения; - строка неизменяема и хранит байты, а не символы. Индексация даёт байт, поэтому у строки с кириллицей длина в байтах вдвое больше числа символов. Перебор через
rangeдаёт руны и корректно обрабатывает многобайтовые последовательности. Именно поэтому существует отдельный тип руны; - нулевые значения: каждая переменная без явной инициализации получает нулевое значение своего типа:
0,false, пустая строка,nilдля ссылочных. Неинициализированных переменных в языке нет вовсе; - литералы без типа подстраиваются под контекст, поэтому
const x = 1можно присвоить и вint, и вfloat64.
Составные типы стоит назвать отдельно: массив фиксированной длины (значимый тип, копируется целиком), срез (заголовок с указателем на массив, длиной и ёмкостью), карта, канал, структура, интерфейс, указатель и функция. Различие массива и среза важно: первый копируется при передаче, второй передаёт заголовок, и изменения видны вызывающему.
Где спотыкаются
Считают, что длина строки равна числу символов.
Ждут неявного приведения между целыми разной ширины.
Путают массив и срез.
Не знают про руны и портят строки при обрезке по байтам.