go 語言字符類型 byte 與 rune案例詳解
golang
的字符有如下兩種:
- 一種是
uint8['ju:n?t]
類型叫做 byte 型,代表了 ASCII 碼的一個(gè)字符。 - 另一種是
rune[ru?n]
類型,代表一個(gè) UTF-8 字符,當(dāng)需要處理中文、日文或者其他復(fù)合字符時(shí),則需要用到 rune 類型。rune 類型等價(jià)于 int32 類型。
一、byte
類型介紹
byte 類型是 uint8 的別名,可以表達(dá)只占用 1 個(gè)字節(jié)的傳統(tǒng) ASCII 編碼的字符,例如 var c byte = 'A'
用單引號(hào)括起來的單個(gè)字符是字符類型,用雙引號(hào)括起來的字符是字符串類型
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) } // 結(jié)果如下 65 uint8 65 int32 AB string 67 88
二、rune
類型介紹
- 在書寫 Unicode 字符時(shí),需要在 16 進(jìn)制數(shù)之前加上前綴
\u
或者\U
。 - Unicode 至少占用 2 個(gè)字節(jié),所以我們使用 int16 或者 int 類型來表示。
- 需要使用到 4 字節(jié),則使用
\u
前綴,如果需要使用到 8 個(gè)字節(jié),則使用\U
前綴。
var h int = '\u0041' fmt.Println(h) // 65 var i int = '\U00000041' fmt.Println(i) // 65
三、遍歷含有中文(Unicode)時(shí)差異
3.1、遍歷打印一個(gè)字符串,當(dāng)使用byte類型時(shí):
package main import "fmt" func main(){ str:="hello 世界" for i:=0;i<len(str);i++{ fmt.Printf("%c",str[i]) // hello ??? fmt.Printf("\n") } } // 結(jié)果如下: h e l l o ? ? ?
上面結(jié)果,英文字符正確打印,但中文亂碼。是因?yàn)閁TF8編碼下一個(gè)中文漢字由3~4個(gè)字節(jié)組成,而字符串是由byte字節(jié)組成,所以長度也是byte字符長度,這樣遍歷時(shí)遇到中文就亂碼了。
3.2、使用rune 類型來遍歷字符串
在 Go 中,有一個(gè)遍歷方式是 range
,它默認(rèn)就是以 UTF-8 編碼形式去讀每一個(gè)字符。當(dāng)涉及到的字符串中含有非英文字符時(shí),可以使用 range 來遍歷:
104 101 108 108 111 32 19990 30028
此時(shí)輸出的字節(jié)編碼就是 UTF-8 編碼號(hào),UTF-8 編碼是包含 ASCII 編碼的,所以前 6 個(gè)編號(hào)還是一樣的,后面兩個(gè)編號(hào)分別代表世,界。
四、go 語言字符串修改
所謂對字符串的修改其實(shí)不是對字符串本身的修改,而是復(fù)制字符串,同時(shí)修改值,即重新分配來內(nèi)存。
在go中修改字符串,需要先將字符串轉(zhuǎn)化成數(shù)組,[]byte
或 []rune
,然后再轉(zhuǎn)換成 string型。
4.1、對于全是ASCII編碼的字符串:
package main import "fmt" func main(){ str:="hello" fmt.Println(str) s1:=[]byte(str) s1[0]='H' fmt.Println(string(s1)) } // 結(jié)果如下 hello Hello
4.2、對于包含非ASCII編碼的字符串:
package main import "fmt" func main(){ str01:="hello 世界" fmt.Println(str01) s2:=[]rune(str01) s2[0]='H' fmt.Println(string(s2)) } // 結(jié)果如下 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/
到此這篇關(guān)于go 語言字符類型 byte 與 rune案例詳解的文章就介紹到這了,更多相關(guān)go 語言字符類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言實(shí)現(xiàn)MapReduce的示例代碼
MapReduce是一種備受歡迎的編程模型,它最初由Google開發(fā),用于并行處理大規(guī)模數(shù)據(jù)以提取有價(jià)值的信息,本文將使用GO語言實(shí)現(xiàn)一個(gè)簡單的MapReduce,需要的可以參考下2023-10-10Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10golang 實(shí)現(xiàn)一個(gè)負(fù)載均衡案例(隨機(jī),輪訓(xùn))
這篇文章主要介紹了golang 實(shí)現(xiàn)一個(gè)負(fù)載均衡案例(隨機(jī)、輪訓(xùn)),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go文件操作(新建打開寫入讀取刪除關(guān)閉)學(xué)習(xí)筆記
這篇文章主要為大家介紹了Go文件操作(新建打開寫入讀取刪除關(guān)閉)學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01