Почему строка не может быть преобразована в массив других типов данных, кроме uint8 и int32? - PullRequest
0 голосов
/ 25 апреля 2019

Когда я пытаюсь преобразовать string в []int, компиляция не удалась. и я обнаружил, что строка может конвертировать to int32(rune) и uint8(byte). Это мой тестовый код:

s1 := "abcd"
b1 := []byte(s1)
r1 := []rune(s1)
i1 := []int8(s1) //error

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Краткий ответ: потому что спецификация языка не позволяет этого.

Допустимые преобразования для непостоянных значений: Спецификация: Преобразования:

Непостоянное значение x может быть преобразовано в тип T в любом из следующих случаев:

  • x - это , присваиваемое - T.
  • игнорирование тегов структуры (см. Ниже), тип x и T имеют идентичных базовых типов .
  • игнорирование тегов структуры (см. Ниже), x 's type и T являются типами указателей, которые не являются определенными типами , и их базовые типы указателей имеют идентичные базовые типы. Типы
  • x и T оба являются целыми числамиили типы с плавающей запятой. Типы
  • x и T являются сложными типами.
  • x - целое число или фрагмент байтов или рун, а T -тип строки.
  • x - строка, а T - фрагмент байтов или рун.

Более длинный ответэто:

Спецификация: Преобразования: преобразования в и из типа строки:

  1. Преобразование целого числа со знаком или без знака встроковый тип возвращает строку, содержащую UTF-8 представление целого числа.Значения вне диапазона допустимых кодовых точек Unicode преобразуются в "\uFFFD".

  2. Преобразование фрагмента байтов в строковый тип приводит к строке, последовательные байты которой являются элементами фрагмента.

  3. Преобразование фрагмента рун в строковый тип дает строку, которая представляет собой объединение отдельных значений рун, преобразованных в строки.

  4. Преобразование значения типа строки в тип фрагмента байтов дает фрагмент, последовательные элементы которого являются байтами строки.

  5. Преобразование значениятип строки для фрагмента типа рун дает фрагмент, содержащий отдельные кодовые точки Unicode строки.

Преобразование string в []byte«полезный», потому что это последовательность байтов текста в кодировке UTF-8, именно так Go хранит строки в памяти, и обычно это данные, которые вы должны хранить / передавать для доставки байта string over-потоков (таких как io.Writer), и аналогично, это то, что вы можете получить из io.Reader.

Преобразование string в[]rune также полезен, он приводит к символам (рунам) текста, так что вы можете легко просматривать / обрабатывать символы string (что часто требуется в реальных приложениях).

Преобразование string в []int8 не очень полезно, поскольку потоки байтов работают на byte с (что является псевдонимом uint8, а не int8).Если в конкретном случае вам нужен []int8 из string, вы можете написать свой собственный конвертер (который, скорее всего, преобразует отдельные байты строки в значения int8).

1 голос
/ 25 апреля 2019

из исходной документации:

строка - это набор всех строк 8-битных байтов, условно, но не обязательно представляющий текст в кодировке UTF-8. Строка может быть пустой, но не ноль. Значения строкового типа являются неизменяемыми.

так что строка такая же как [] uint8

, поэтому вы можете конвертировать его в руны и uint8

...