今天看golang代码看到一个单词 rune ,熟悉而陌生。之前学习go并没有过多注意这个“神秘符号”。 rune在golang中是int32的别名,在各个方面都与int32相同。 被用来区分字符值和整数值。
做几个小测试
func main() {
s:="hello你好"
fmt.Println(len(s)) //输出11 ,其中一个汉字占用3个长度
//输出7 汉字和英文一样,都占用一个字符,注意:需要转换为rune切片,与byte一样,都需要转换为切片
fmt.Println(len([]rune(s))) //输出7
fmt.Println(len([]byte(s))) //输出11
fmt.Println("--------------")
s1:="你"
fmt.Println(len([]byte(s1)))//输出3
fmt.Println(rune('您')) //输出对应的unicode 编码
}
运行效果:
应用:
假如要输出一段字符串(包括英文、中文、特殊符号等)
func main() {
str:="hello 你好Go语言^*^!" //需要输出的字符串
fmt.Println("根据长度直接输出")
for i:=0;i< len(str);i++{
fmt.Printf("%d%c ",i,str[i])
}
fmt.Println("\n\n通过range输出")
for index,data:=range str{
fmt.Printf("%d:%c ",index,data)
}
fmt.Println("\n\n转换为[]byte 输出")
s1:=[]byte(str)
for index,data:=range s1{
fmt.Printf("%d:%c ",index,data)
}
fmt.Println("\n\n转换为[]rune 输出")
s2:=[]rune(str)
for index,data:=range s2{
fmt.Printf("%d:%c ",index,data)
}
}
运行结果:
通过以上实例,可以看出 for...range在输出时,将汉字作为3个字符一起处理。 按照长度、[ ]byte输出时,汉字被分割成3个独立的字符(在go语言中一个汉字3个字符),因此会出现乱码。采用[ ]rune方式时,汉字被转换为一个字符(长度为:15),可以直接输出。
总结:如果要输出(取出)对于包含中文等特殊字符的字符串,可以采用
1) for...range方法
2)转为为 [ ]rune切片,通过 for...range方法
由此可知,通过 for...range可以很快捷的实现特殊字符的输出(取出)。