Печать строк и символов в шестнадцатеричном виде в Go

Почему кириллические строки в шестнадцатеричном формате отличаются от кириллических символов в шестнадцатеричном формате?

str  := "Э"
fmt.Printf("%x\n", str)
//result d0ad
    
str  := 'Э'
fmt.Printf("%x\n", str)
//result 42d

🤔 А знаете ли вы, что...
Go стал популярным языком для разработки смарт-контрактов на блокчейне Ethereum.


24
1

Ответ:

Решено

При печати шестнадцатеричного представления string печатается шестнадцатеричное представление его байтов, а при печати шестнадцатеричного представления rune печатается шестнадцатеричное представление числа, для которого оно является псевдонимом (rune является псевдонимом int32).

А strings в Go содержат закодированную UTF-8 последовательность байтов текста. В представлении UTF-8 символы (руны) с числовым кодом > 127 имеют многобайтовое представление.

runeЭ имеет многобайтовое представление в UTF-8 (будучи [208, 173]), и это не то же самое, что многобайтовое представление 32-битного целого числа 1069 = 0x42d. Целые числа представлены с использованием дополнение до двух в памяти.

Рекомендуемая запись в блоге: Строки, байты, руны и символы в Go