Что такое byte в Go и является ли он примитивным типом или алиасом
Что проверяют
Различаете ли вы алиас типа и новый определённый тип. Вопрос кажется тривиальным, поэтому оценивают точность: кандидат либо знает механику объявления типов в Go, либо повторяет заученное «это восьмибитное целое».
Как отвечать
byte это не самостоятельный примитивный тип, а предобъявленный алиас для uint8. В терминах языка это type byte = uint8 со знаком равенства: два имени одного и того же типа, а не два разных типа. Следствия прямые: byte и uint8 взаимозаменяемы без преобразования, %T в форматировании печатает uint8, рефлексия тоже покажет uint8, а []byte можно передать в функцию, ожидающую []uint8.
Отличие от объявления вида type MyByte uint8: там создаётся новый тип со своим множеством методов, и присваивание требует явного преобразования. Алиасов в языке предобъявлено всего два: byte для uint8 и rune для int32.
Смысл алиаса чисто семантический. []byte читается как сырые данные, []uint8 как список чисел. Строка в Go это неизменяемая последовательность байтов, индексация строки даёт byte, а обход через range выдаёт rune, то есть кодовую точку UTF-8.
Где спотыкаются
Отвечают «примитивный тип» и на уточняющий вопрос не могут объяснить разницу между алиасом и определённым типом. Проверяют это обычно так: спрашивают, соберётся ли код, где []byte передают туда, где объявлен []uint8. Соберётся, и это лучшее доказательство, что тип один.
Путают байты и символы. Длина строки возвращает число байтов, а не знаков: кириллица занимает по два байта, эмодзи больше. Отсюда классическая ошибка с обрезкой строки по индексу, которая рвёт символ пополам.
Ждут от алиаса типобезопасности. Компилятор не различит byte и uint8 ни при присваивании, ни при выборе перегрузки, а объявить метод на предобъявленном типе нельзя вовсе. Нужна отдельная сущность, значит нужен новый тип, а не алиас.