golang
的字符有如下两种:
uint8['ju:nɪt]
类型叫做 byte 型,代表了 ASCII 码的一个字符。rune[ruːn]
类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。byte
类型介绍byte 类型是 uint8 的别名,可以表达只占用 1 个字节的传统 ASCII 编码的字符,例如 var c byte = 'A'
用单引号括起来的单个字符是字符类型,用双引号括起来的字符是字符串类型
package main import "fmt" func main(){ var c byte = 'A' fmt.Println(c) fmt.Printf("%T ",c) fmt.Printf("\n") var d rune = 'A' fmt.Println(d) fmt.Printf("%T ",d) // var e byte = 'AB' // more than one character in rune literal // var e rune = 'AB' // more than one character in rune literal var e string = "AB" fmt.Println(e) fmt.Printf("%T ",e) fmt.Printf("\n") var f byte = 'C' println(f) f = 88 println(f) } // 结果如下 65 uint8 65 int32 AB string 67 88
rune
类型介绍\u
或者\U
。\u
前缀,如果需要使用到 8 个字节,则使用\U
前缀。var h int = '\u0041' fmt.Println(h) // 65 var i int = '\U00000041' fmt.Println(i) // 65
package main import "fmt" func main(){ str:="hello 世界" for i:=0;i<len(str);i++{ fmt.Printf("%c",str[i]) // hello ä¸ç fmt.Printf("\n") } } // 结果如下: h e l l o ä ¸ ç
上面结果,英文字符正确打印,但中文乱码。是因为UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了。
在 Go 中,有一个遍历方式是 range
,它默认就是以 UTF-8 编码形式去读每一个字符。当涉及到的字符串中含有非英文字符时,可以使用 range 来遍历:
104 101 108 108 111 32 19990 30028
此时输出的字节编码就是 UTF-8 编码号,UTF-8 编码是包含 ASCII 编码的,所以前 6 个编号还是一样的,后面两个编号分别代表世,界。
所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。
在go中修改字符串,需要先将字符串转化成数组,[]byte
或 []rune
,然后再转换成 string型。
package main import "fmt" func main(){ str:="hello" fmt.Println(str) s1:=[]byte(str) s1[0]='H' fmt.Println(string(s1)) } // 结果如下 hello Hello
package main import "fmt" func main(){ str01:="hello 世界" fmt.Println(str01) s2:=[]rune(str01) s2[0]='H' fmt.Println(string(s2)) } // 结果如下 hello 世界 Hello 世界
参考文档
1、https://blog.csdn.net/AXIMI/article/details/120379225
2、https://lesscode.work/sections/62b076e9d22ba.html
3、https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624
4、https://www.cnblogs.com/wjaaron/p/14822799.html
5、https://www.bbsmax.com/A/D854aVKpdE/