栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Golang用for...range遍历字符串的奇怪表现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang用for...range遍历字符串的奇怪表现

我们知道Golang字符串可以用操作[]byte相同的方式来操作,可以用下标来访问,也可以取子串,用下标来访问的话,每个元素的类型是个byte(uint8),例如

func SubStr(s string, start, length int) string {
	return s[start:start+length]
}

func main() {
	str := "abcde12345"
	char := str[3]
	fmt.Println(char, reflect.ValueOf(char).Kind()) // 100 uint8
	sub := str[3:7]
	fmt.Println(sub) // de12
	fmt.Println(SubStr("hello world!", 6, 5)) // world
	str2 := "你好,China"
	for i := 0; i < len(str2); i++ {
		fmt.Println(i, str2[i], reflect.ValueOf(str2[i]).Kind())
		
	}
}

从上面可以看出,Golang的字符串操作和把字符串转成[]byte之后的操作基本一致,除了取子串时一个返回的是字符串,一个返回的是另一个[]byte,但注意如果用for…range来遍历一个字符串,表现则完全不同,这也是我们平时使用时需要注意的一点,例如:

func main() {
	str := "你好,China"
	for i, char := range str {
		fmt.Println(i, char, reflect.ValueOf(char).Kind())
		// 0 20320 int32
		// 3 22909 int32
		// 6 65292 int32
		// 9 67 int32
		// 10 104 int32
		// 11 105 int32
		// 12 110 int32
		// 13 97 int32
	}
}

for…range遍历字符串每个元素的类型是rune(int32),即utf-8字符对应的unicode码点,而索引是每个utf-8字符的第一个字节在字符串中的下标,对比下把字符串转换为[]rune的区别

func main() {
	str := "你好,China"
	unicodes := []rune(str)
	for i, char := range unicodes {
		fmt.Println(i, char, reflect.ValueOf(char).Kind())
		// 0 20320 int32
		// 1 22909 int32
		// 2 65292 int32
		// 3 67 int32
		// 4 104 int32
		// 5 105 int32
		// 6 110 int32
		// 7 97 int32
	}
}

遍历出来的索引和for…range不同,所以平时的使用应特别注意用for…range来遍历一个字符串的奇怪表现,避免用错。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/683676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号