首页 > 解决方案 > 在字符串上使用范围时发生类型不一致

问题描述

以下代码:

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

标签: stringgo

解决方案


Go 编程语言规范

对于语句

对于带有范围子句的语句

对于字符串值,“range”子句从字节索引 0 开始迭代字符串中的 Unicode 代码点。在连续迭代中,索引值将是连续 UTF-8 编码代码点的第一个字节的索引rune 类型的字符串和第二个值将是相应代码点的值。如果迭代遇到无效的 UTF-8 序列,则第二个值将是 0xFFFD,即 Unicode 替换字符,并且下一次迭代将在字符串中前进一个字节。


没有不一致。

在 Go 中rune,Unicode 代码点是int32.

Go 不是一种仅限于 ASCII 字符集的旧语言。像大多数 [all?] 现代语言一样,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 联盟


推荐阅读