Что такое rune
в го?
Я гуглил, но Голанг говорит только в одной строке: rune
это псевдоним дляint32
.
Но как же целые числа используются повсеместно, как случаи замены?
Ниже приведен раздел функций. Что это все <=
и -
?
И почему нет switch
никаких аргументов?
&&
должно означать и , но что r <= 'z'
?
func SwapRune(r rune) rune {
switch {
case 'a' <= r && r <= 'z':
return r - 'a' + 'A'
case 'A' <= r && r <= 'Z':
return r - 'A' + 'a'
default:
return r
}
}
Большинство из них из http://play.golang.org/p/H6wjLZj6lW
func SwapCase(str string) string {
return strings.Map(SwapRune, str)
}
Я понимаю, что это сопоставление, rune
чтобы string
он мог вернуть поменялся строкой. Но я не понимаю, как именно rune
или byte
работает здесь.
[]rune
может быть установлен в логический, числовой или строковый тип. См. Stackoverflow.com/a/62739051/12817546 .Ответы:
Рунические литералы - это просто 32-битные целочисленные значения ( однако они являются нетипизированными константами, поэтому их тип может меняться ). Они представляют кодовые точки Unicode. Например, литерал руны
'a'
- это на самом деле число97
.Поэтому ваша программа в значительной степени эквивалентна:
Это должно быть очевидно, если вы посмотрите на отображение Unicode, которое идентично ASCII в этом диапазоне. Кроме того, 32 фактически является смещением между прописной и строчной кодовой точкой символа. Таким образом, добавляя
32
к'A'
, вы получаете'a'
и наоборот.источник
unicode.ToLower(r rune) rune
.func SwapRune(r rune) rune { if unicode.IsUpper(r) { r = unicode.ToLower(r) } else { r = unicode.ToUpper(r) }; return r }
Из примечаний к выпуску Go lang: http://golang.org/doc/go1#rune
Руна - это Тип. Он занимает 32 бита и предназначен для представления Unicode CodePoint . В качестве аналогии набор английских символов, закодированный в «ASCII», имеет 128 кодовых точек. Таким образом, может поместиться внутри байта (8 бит). Из этого (ошибочного) предположения C рассматривал символы как «байты»
char
, а «строки» как «последовательность символов»char*
.Но угадайте что. Есть много других символов, изобретенных людьми, кроме символов «abcde ..». И их так много, что нам нужно 32 бит для их кодирования.
В Голанге тогда a
string
является последовательностьюbytes
. Однако, поскольку несколько байтов могут представлять кодовую точку руны, строковое значение также может содержать руны. Таким образом, он может быть преобразован в[]rune
, или наоборот.Пакет Unicode http://golang.org/pkg/unicode/ может дать представление о богатстве задачи.
источник
rune
похожеint32
и имеет много битов.string
последовательностьrune
с» - я не думаю, что это правда? Перейти в блог : «строка - это просто набор байтов»; Go lang spec : «Строковое значение - это (возможно, пустая) последовательность байтов»not bytes
. Тогда вы можете сказать: «Строки состоят из рун, а руны - из байтов». Что-то в этом роде. Затем снова. это не совсем так.Я старался, чтобы мой язык был простым, чтобы непрофессионал понимал
rune
.Руна - это персонаж. Вот и все.
Это один персонаж. Это персонаж из любого алфавита с любого языка из любой точки мира.
Чтобы получить строку мы используем
ИЛИ
Строка отличается от руны. В рунах мы используем
Теперь руна также является псевдонимом для
int32
... А что?Причина, по которой руна является псевдонимом,
int32
заключается в том, что мы видим, что в схемах кодирования, таких как нижекаждый символ отображается на какое-то число, и это число, которое мы храним. Например, сопоставляется 97 и когда мы храним , что число это просто число и так , что это путь руна является псевдонимом для int32. Но это не просто число. Это число с 32 «нулями и единицами» или «4» байтами. (Примечание: UTF-8 является 4-байтовой схемой кодирования)
Как руны относятся к строкам?
Строка - это коллекция рун. В следующем коде:
Мы пытаемся преобразовать строку в поток байтов. Выход:
Мы можем видеть, что каждый из байтов, составляющих эту строку, является руной.
источник
A string is not a collection of runes
строго говоря, это не правильно. Вместо этого строка представляет собой байтовый фрагмент, закодированный с помощью utf8. Каждый символ в строке на самом деле занимает 1 ~ 3 байта, в то время как каждая руна занимает 4 байта. Вы можете конвертировать между строкой и [] рунами, но они разные.Я не хватает репутации , чтобы добавить комментарий к fabrizioM в ответ , так что я должен разместить его здесь вместо этого.
Ответ Фабрицио в значительной степени правильный, и он, безусловно, уловил суть проблемы - хотя и следует провести различие.
Строка НЕ обязательно является последовательностью рун. Это обертка над «ломтиком байтов», причем обрезь является оберткой над массивом Go. Какая разница это делает?
Тип руны обязательно является 32-битным значением, то есть последовательность значений типов рун обязательно будет иметь некоторое количество битов x * 32. Строки, представляющие собой последовательность байтов, вместо этого имеют длину x * 8 бит. Если бы все строки были на самом деле в Юникоде, это различие не оказало бы никакого влияния. Так как строки представляют собой кусочки байтов , Go может использовать ASCII или любую другую произвольную байтовую кодировку.
Строковые литералы, однако, должны быть записаны в исходный код в UTF-8.
Источник информации: http://blog.golang.org/strings
источник
(У меня сложилось впечатление, что приведенные выше ответы по-прежнему не отражают различия и отношения между ними
string
и[]rune
очень четко, поэтому я постараюсь добавить еще один ответ с примером.)Как
@Strangework
сказал ответ,string
и[]rune
тихо разные.Отличия -
string
&[]rune
:string value
является байтовым срезом только для чтения. И строковый литерал закодирован в utf-8. Каждый символ вstring
действительности занимает 1 ~ 3 байта, в то время как каждыйrune
занимает 4 байтаstring
,len()
и индекс основаны на байтах.[]rune
,len()
и индекс основаны на руне (или int32).Отношения -
string
&[]rune
:string
в[]rune
, каждый символ utf-8 в этой строке становитсяrune
.[]rune
вstring
, каждыйrune
становится символом utf-8 вstring
.Подсказки:
string
и[]rune
, но все же они разные, как по типу, так и по общему размеру.(Я хотел бы добавить пример, чтобы показать это более четко.)
Код
string_rune_compare.go:
Выполнение:
Вывод:
Объяснение:
Строка
hello你好
имеет длину 11, потому что первые 5 символов занимают по 1 байту, а последние 2 символа по 3 байта.total bytes = 5 * 1 + 2 * 3 = 11
len()
строка основана на байтах, первая строка печатаетсяlen: 11
uint8
(такbyte
как это псевдоним типаuint8
в go).Когда конвертировать
string
в[]rune
, он нашел 7 utf8 символов, таким образом 7 рун.len()
на[]rune
основе руны, то последняя строка печатаетсяlen: 7
.[]rune
через индекс, он получит доступ к базе на руне.Поскольку каждая руна взята из символа utf8 в исходной строке, вы также можете сказать, что
len()
и операция с индексами[]rune
основаны на символах utf8.источник
fmt.Println("hello你好"[0])
он возвращает фактическую кодовую точку UTF-8 вместо байтов.s[0]
она печатаетs[0]: 104, type: uint8
, тип isuint8
означает, что это байт. Для символов ASCII, таких какh
utf-8, также используется один байт для его представления, поэтому кодовая точка совпадает с одним байтом; но для китайских символов, как你
, он использует 3 байта.Все остальные освещали часть, касающуюся рун, поэтому я не буду об этом говорить.
Тем не менее, есть также вопрос, связанный с
switch
отсутствием каких-либо аргументов. Это просто потому, что в Golangswitch
без выражения есть альтернативный способ выражения логики if / else. Например, написать это:так же, как писать это:
Вы можете прочитать больше здесь .
источник
Руна - это значение типа int32, и, следовательно, это тип Go, который используется для представления кодовой точки Unicode. Кодовая точка Unicode или позиция кода - это числовое значение, которое обычно используется для представления отдельных символов Unicode;
источник