Зацикливание строки возвращает int32 - PullRequest
0 голосов
/ 25 ноября 2018

Почему ранжирование по строке возвращает значение int32 вместо исходного символа в отличие от других языков?

, например:

func main() {

    var s string
    s = "Hello"
    for _, v := range s {
        fmt.Println(v)
    }

}

Возвращает:

72
101
108
108
111

Должны ли мы использовать преобразование, как показано ниже, чтобы получить оригинальный символ?

func main() {

    var s string
    s = "Hello"
    for _, v := range s {
        fmt.Println(string(v))
    }

}

1 Ответ

0 голосов
/ 25 ноября 2018

Спецификация языка программирования Go

Для операторов

Для операторов с предложением диапазона

Для операторастроковое значение, предложение «range» перебирает кодовые точки Unicode в строке, начиная с байтового индекса 0. В последовательных итерациях значение индекса будет индексом первого байта последовательных кодированных точек UTF-8 в строкеи второе значение типа rune будет значением соответствующей кодовой точки.Если итерация встречает недопустимую последовательность UTF-8, второе значение будет 0xFFFD, символ замены Unicode, и следующая итерация будет продвигать один байт в строке.


In Goсимвол представляет собой кодовую точку Unicode, тип Go rune (псевдоним int32).Go string s используются для хранения кодовых точек Unicode в кодировке UTF-8.


Спецификация языка программирования Go

Преобразования

Преобразования в и из строкового типа

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

string('a')       // "a"
string(-1)        // "\ufffd" == "\xef\xbf\xbd"
string(0xf8)      // "\u00f8" == "ø" == "\xc3\xb8"
type MyString string
MyString(0x65e5)  // "\u65e5" == "日" == "\xe6\x97\xa5"

Например,

package main

import (
    "fmt"
)

func main() {
    helloworld := "Hello, 世界"
    fmt.Println(helloworld)
    for i, r := range helloworld {
        fmt.Println(i, r, string(r))
    }
}

Детская площадка: https://play.golang.org/p/R5sBeGiJzR4

Вывод:

Hello, 世界
0 72 H
1 101 e
2 108 l
3 108 l
4 111 o
5 44 ,
6 32  
7 19990 世
10 30028 界

Ссылки:

Блог Go: строки, байты, руны и символы в Go

Консорциум Unicode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...