go rune 简要分析——输出(取出)对于包含中文等特殊字符的字符串

今天看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可以很快捷的实现特殊字符的输出(取出)。

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/82468978