Несоответствие типов происходит при использовании диапазона в строке - PullRequest
0 голосов
/ 23 декабря 2018

Следующий код:

package main

import "fmt"

func main() {
    str := "s"
    for i, v := range str {
        fmt.Printf("type of s[%v]: %T\n", i, str[i])
        fmt.Printf("type of v: %T\n", v)
    }
}

выход:

type of s[0]: uint8
type of v: int32

В большинстве языков строки состоят из 8-битных символов со знаком или без знака.Почему v int32 вместо uint8?

1 Ответ

0 голосов
/ 23 декабря 2018

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

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

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

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


Естьбез противоречий.

В Go rune, кодовая точка Unicode, является псевдонимом для int32.

Go не является старым языком, ограниченным набором символов ASCII.Как и большинство [всех?] Современных языков, Go использует Unicode.


Например,

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/Q_iEzdlGxLu

Выход:

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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...