Go поддерживает преобразование из rune
в byte
, как и для всех пар типов numeri c. Было бы удивительно особенным случаем, если бы преобразование int32
в byte
было бы запрещено.
Но базовым типом для rune
является int32
(потому что Go использует UTF-8 )
Здесь упускается важная деталь: rune
- это псевдоним для int32
. Они одного типа.
Верно, что базовый тип rune
равен int32
, но это потому, что rune
и int32
являются одним и тем же типом, а базовый тип встроенного типа - сам тип.
Представление кодовых точек Unicode как int32
значений не связано с кодировкой UTF-8.
преобразование, следовательно, приводит к потере информации
Да, преобразование между типами numeri c может привести к потере информации. Это одна из причин, почему преобразования в Go должны быть явными.
Обратите внимание, что оператор var b byte = '©'
не выполняет никаких преобразований. Выражение '@'
- это нетипизированная константа.
Компилятор сообщает об ошибке, если присвоение нетипизированной константы приводит к потере информации. Например, оператор var b byte = '世'
вызывает ошибку компиляции.
Все функции кодирования UTF-8 в языке относятся к типу string
. Все преобразования, поддерживающие UTF-8, относятся к типу string
или наоборот. Преобразование []byte(numericType)
может поддерживаться, но это приведет к выходу кодировки UTF-8 за пределы типа string
.
Авторы Go сожалеют о включении преобразования string(numericType)
, потому что это не очень полезно на практике и конверсия - это не то, чего некоторые ожидают. Библиотечная функция - лучшее место для функциональности.