go 語(yǔ)言字符類型 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)括起來(lái)的單個(gè)字符是字符類型,用雙引號(hào)括起來(lái)的字符是字符串類型
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 類型來(lái)表示。
- 需要使用到 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é)組成,所以長(zhǎng)度也是byte字符長(zhǎng)度,這樣遍歷時(shí)遇到中文就亂碼了。
3.2、使用rune 類型來(lái)遍歷字符串
在 Go 中,有一個(gè)遍歷方式是 range,它默認(rèn)就是以 UTF-8 編碼形式去讀每一個(gè)字符。當(dāng)涉及到的字符串中含有非英文字符時(shí),可以使用 range 來(lái)遍歷:
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 語(yǔ)言字符串修改
所謂對(duì)字符串的修改其實(shí)不是對(duì)字符串本身的修改,而是復(fù)制字符串,同時(shí)修改值,即重新分配來(lái)內(nèi)存。
在go中修改字符串,需要先將字符串轉(zhuǎn)化成數(shù)組,[]byte 或 []rune,然后再轉(zhuǎn)換成 string型。
4.1、對(duì)于全是ASCII編碼的字符串:
package main
import "fmt"
func main(){
str:="hello"
fmt.Println(str)
s1:=[]byte(str)
s1[0]='H'
fmt.Println(string(s1))
}
// 結(jié)果如下
hello
Hello4.2、對(duì)于包含非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 語(yǔ)言字符類型 byte 與 rune案例詳解的文章就介紹到這了,更多相關(guān)go 語(yǔ)言字符類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決panic: assignment to entry in nil
這篇文章主要介紹了解決panic: assignment to entry in nil map問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2008-01-01
go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn))
這篇文章主要為大家介紹了go的defer和閉包示例說(shuō)明(非內(nèi)部實(shí)現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解
這篇文章主要為大家介紹了go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
golang執(zhí)行命令獲取執(zhí)行結(jié)果狀態(tài)(推薦)
這篇文章主要介紹了golang執(zhí)行命令獲取執(zhí)行結(jié)果狀態(tài)的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11
Go語(yǔ)言字符串操作指南:簡(jiǎn)單易懂的實(shí)戰(zhàn)技巧
本文將介紹Go語(yǔ)言中字符串的實(shí)戰(zhàn)操作,通過(guò)本文的學(xué)習(xí),讀者將掌握Go語(yǔ)言中字符串的常用操作,為實(shí)際開發(fā)提供幫助,需要的朋友可以參考下2023-10-10
Golang 探索對(duì)Goroutine的控制方法(詳解)
下面小編就為大家分享一篇Golang 探索對(duì)Goroutine的控制方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
解析Go語(yǔ)言編程中的struct結(jié)構(gòu)
這篇文章主要介紹了Go語(yǔ)言編程中的struct結(jié)構(gòu),是Go語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10

