bubbleboom
@bubbleboom

Почему golang кодирует символ строки только в byte(uint8) и rune(int32)?

Добрый день.
Вопрос с примером, имеем:
charLine := "слово" 
fmt.Println(charLine) // кодирует кириллицу в по 2 байта на каждый символ. По дефолту тип элементов(символов) byte т.е. uint8

Вопрос n1.
1) Почему я не могу явно указать какой тип элементов использовать в переменной?
----
Хорошо, идем другим путем. Делаем срез текстовой строки:
sliceLine := []byte(charLine)
fmt.Println(sliceLine) // byte это алиас на тип uint8, т.е. сейчас видим бинарное представление данных, как сделано для типа string с приведением к строке. Делая срез мы можем указать какой тип использовать: uint8 или int32 (rune)


Вопрос n2
Почему для среза, я не могу указать тип uint16. Для кириллицы хватит за глаза. А потом просто как обычно привести из числа в строчку штатной функцией string() ?

Вопрос имеет некоторую практическую ценность. Допустим я большой жмот :) и мне жалко выделять в памяти 4 байта на каждый символ, используя rune. Поэтому хочу выделять только 2 байта используя uint16 (думаю нет смысла для символа учитывать sign bit => кириллица влезет) но golang меня не понимает. Или я его :)
Да, uint8 (byte) не устраивает тем, что кодирует кириллицу по несколько байт и работать с ней как с массивом символов – не удобно.
  • Вопрос задан
  • 3157 просмотров
Решения вопроса 1
david_mz
@david_mz
веб-разработчик: php, javascript, go
А чего Вы, собственно, пытаетесь добиться этими действиями?

Если речь о памяти, то в Go внутреннее представление строк — UTF-8. Когда Вы пишете charLine := "слово", Вы определяете UTF-8-строку.

В Go строка может быть конвертирована (туда и обратно) только в два типа — в []byte и в []rune. []byte — это изменяемая копия байтов неизменяемой строки, []rune — результат парсинга UTF-8-байтов строки в 4-байтовые unicode-коды.

Вопрос, почему только эти два, а не, скажем []float, лишён смысла. Потому что так сделан язык. Если Вам нужен []uint16 — ну напишите свой конвертер, это не сложно.

В документации это всё описано тут: golang.org/ref/spec#Conversions_to_and_from_a_stri...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы