Добрый день.
Вопрос с примером, имеем:
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) не устраивает тем, что кодирует кириллицу по несколько байт и работать с ней как с массивом символов – не удобно.