Что такое руна?
Что такое rune
в Go?
Я был googling, но Golang только говорит в одной строке: rune
является псевдонимом для int32
.
Но почему целые числа используются повсюду, например, в случаях замены?
Ниже приведена функция swapcase.
Что все <=
и -
?
И почему у 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
.
Ответы
Ответ 1
Рунические литералы - это просто целое значение (как вы уже писали). Они "сопоставляются" с их кодовым номером unicode. Например, буква буква 'a' на самом деле является номером 97.
Эта программа в значительной степени эквивалентна:
package main
import "fmt"
func SwapRune(r rune) rune {
switch {
case 97 <= r && r <= 122:
return r - 32
case 65 <= r && r <= 90:
return r + 32
default:
return r
}
}
func main() {
fmt.Println(SwapRune('a'))
}
что должно быть очевидно, если вы посмотрите на отображение юникода, которое идентично ASCII в этом диапазоне. И 32 - это смещение символов верхнего и нижнего регистра. Поэтому, если вы добавите 32 в "A", вы получите "a" и наоборот.
Ответ 2
Из примечаний к выпуску Go lang: http://golang.org/doc/go1#rune
Руна - это тип. Он занимает 32 бита и предназначен для представления Unicode CodePoint.
В качестве аналогии английский набор символов, закодированный в "ASCII", имеет 128 кодовых точек. Таким образом, он может помещаться внутри байта (8 бит). Из этого (ошибочного) предположения C обработанные символы как "байты" char
и "строки" как "последовательность символов" char*
.
Но угадай, что. Есть много других символов, изобретенных людьми, отличными от символов "abcde..". И есть так много, что нам нужно 32 бит для их кодирования.
В golang тогда a string
является последовательностью runes
.
Юникодный пакет http://golang.org/pkg/unicode/ может дать ощущение насыщенности проблемы.
Ответ 3
У меня недостаточно репутации, чтобы опубликовать комментарий к fabrizioM answer, поэтому мне придется публиковать его здесь.
Ответ Фабрицио в основном правилен, и он, безусловно, захватил суть проблемы - хотя есть и различия, которые должны быть сделаны.
Строка НЕ обязательно представляет собой последовательность рун. Это оболочка над "кусочком байтов", а срез - оболочкой над массивом Go. Какая разница?
Руна - это обязательно 32-битное значение, то есть последовательность рун обязательно будет иметь некоторое количество бит x * 32. Строки, являющиеся последовательностью байтов, вместо этого имеют длину x * 8 бит. Если бы все строки были на самом деле в Юникоде, эта разница не имела бы никакого эффекта. Однако, поскольку строки являются фрагментами байтов, Go может использовать ASCII или любую другую произвольную байтовую кодировку.
Строковые литералы, однако, должны быть записаны в источник, закодированный в UTF-8.
Источник информации: http://blog.golang.org/strings
Ответ 4
Я пытался сохранить свой язык простым, чтобы непрофессионал понимал rune
.
Руна - символ. Что это.
Это один символ. Это символ из любого алфавита с любого языка из любой точки мира.
Чтобы получить строку, мы используем
double-quotes ""
ИЛИ
back-ticks ``
Строка отличается от руны. В рунах мы используем
single-quotes ''
Теперь руна также является псевдонимом для int32
... Uh Что?
Причина, по которой руна является псевдонимом для int32
, заключается в том, что мы видим, что с помощью схем кодирования, таких как ниже
![введите описание изображения здесь]()
каждый символ сопоставляется с некоторым числом, и поэтому это число, которое мы храним. Например, карты до 97, и когда мы сохраняем это число, это просто номер, и поэтому руна является псевдонимом для int32. Но это не просто номер. Это число с 32 "нулями и единицами" или "4" байтами. (Примечание: UTF-8 представляет собой 4-байтовую схему кодирования)
Как руны относятся к строкам?
Строка представляет собой набор рун. В следующем коде:
package main
import (
"fmt"
)
func main() {
fmt.Println([]byte("Hello"))
}
Мы пытаемся преобразовать строку в поток байтов. Выход:
[72 101 108 108 111]
Мы можем видеть, что каждый из байтов, составляющих эту строку, является руной.
Ответ 5
Все остальные рассмотрели часть, связанную с рунами, поэтому я не буду говорить об этом.
Однако существует также вопрос, связанный с switch
отсутствием аргументов. Это просто потому, что в Golang switch
без выражения есть альтернативный способ выражения if/else логики. Например, написав это:
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It before noon")
default:
fmt.Println("It after noon")
}
аналогично написанию:
t := time.Now()
if t.Hour() < 12 {
fmt.Println("It before noon")
} else {
fmt.Println("It after noon")
}
Вы можете прочитать здесь.