在字符串上使用范围时发生类型不一致

时间:2018-12-23 02:28:49

标签: string go

以下代码:

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 :(得分:6)

  

The Go Programming Language Specification

     

For statements

     

对于带有范围子句的语句

     

对于字符串值,“ range”子句遍历Unicode代码   从字节索引0开始的字符串中的点。连续   迭代,索引值将是的第一个字节的索引   字符串中连续的UTF-8编码的代码点,第二个   符文类型的值将是相应代码的值   点。如果迭代遇到无效的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 界

The Go Blog: Strings, bytes, runes and characters in Go

The Unicode Consortium