Что такое руна?

Что такое 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")
}

Вы можете прочитать здесь.