string - 在字符串上使用范围时发生类型不一致
问题描述
以下代码:
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
?
解决方案
对于带有范围子句的语句
对于字符串值,“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 界
推荐阅读
- r - 使用 Shiny App 从 URL 下载或浏览数据集
- python - 以窗口方式重新排列 PyTorch 张量
- excel - EXCEL,可以调整单元格中的公式以过滤范围和序列吗?
- python - 如何从 Python 脚本调用 cmake 和命令?
- javascript - 服务器“未定义”中的上传问题,因为我想要文件的名称
- google-sheets - 如何根据值将一列分成多列?
- java - Java %u20AC 转换为欧元 €
- java - 使用数组实现优先级队列
- excel - Excel VBA 如何将格式更改为带有注释的单元格
- android - 如何在 ArrayList 中连接项目并设置为 Spinner Android