# Go rune,byte的区别 --- :::success ```javascript= Golang中不能直接对字符串string进行下标操作,都是利用rune跟byte也进行字符串的操作。 ``` ::: - **rune, byte** :::success ```go= rune是用来区分字符值和整数值的 rune 等同于int32,即4个字节长度,常用来处理unicode或utf-8字符。 byte 等同于int8,即一个字节长度,常用来处理ascii字符 中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。 ASCII编码是1个字节,而UTF-8是可变长的编码 当要表示中文等非ASCll编码的字符时,需要使用UTF-8编码来保证不会乱码。 UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了 所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。 在go中修改字符串,需要先将字符串转化成数组,[]byte 或 []rune,然后再转换成 string型。 ``` ::: :::success ```go= package main import "fmt" func main() { str := "你好 world" // 以字节数来计算长度 fmt.Printf("len(str):%d\n", len(str)) // 返回len(str):12 fmt.Printf("len(byte(str)):%d\n", len([]byte(str))) // 返回len(str):12 // 以字符数来计算长度 fmt.Printf("len(rune(str)):%d\n", len([]rune(str))) // 返回len(rune(str)):8 for i := 0; i < len(str); i++ { fmt.Printf("%c", str[i]) // ä½ å¥½ world } fmt.Println() //使用range,其实是使用rune类型来编码的,rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。 for _, value := range str { fmt.Printf("%c", value) // 你好 world } fmt.Println() // 修改全是ASCII编码的字符串 str1 := "abc" s1 := []byte(str1) s1[0] = 'b' fmt.Println(string(s1)) // bbc // 修改非ASCII编码的字符串 str2 := "你好,世界" s2 := []rune(str2) s2[0] = '不' fmt.Println(string(s1)) // 不好,世界 } ``` ::: - 结果输出 ```javascript= len(str):12 len(byte(str)):12 len(rune(str)):8 ä½ å¥½ world 你好 world bbc 不好,世界 ``` ###### tags: `Golang`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up