Go語言中byte類型和rune類型(五)

本篇內容原本準備在上一篇寫的,想了想仍是拆開寫。編程

 

go語言中字符串須要使用用雙引號,而單引號用來表示單個的字符,字符也是組成字符串的元素。go語言的字符有兩種:數組

  1. uint8類型,或者叫 byte 型,表明了ASCII碼的一個字符。
  2. rune類型,表明一個 UTF-8字符

ASCII編碼是1個字節,而UTF-8是可變長的編碼,當要表示中文等非ASCll編碼的字符時,須要使用UTF-8編碼來保證不會亂碼。ui

 

舉個例子,來遍歷打印一個字符串,當使用byte類型時:編碼

func main() { str:="hello 世界"
    for i:=0;i<len(str);i++{ fmt.Printf("%c",str[i]) // hello ä¸ç } }

上面結果,英文字符正確打印,但中文亂碼。是由於UTF8編碼下一個中文漢字由3~4個字節組成,而字符串是由byte字節組成,因此長度也是byte字符長度,這樣遍歷時遇到中文就亂碼了。spa

 

遇到這種帶中文的字符串,能夠使用go提供的另外一個方法來遍歷:code

func main() { str:="hello 世界"
    for _,r:=range str{ fmt.Printf("%c",r) // hello 世界 } }

使用range,實際上是使用rune類型來編碼的,rune類型用來表示utf8字符,一個rune字符由一個或多個byte組成。blog

 

修改字符串

所謂對字符串的修改其實不是對字符串自己的修改,而是複製字符串,同時修改值,即從新分配來內存。內存

在go中修改字符串,須要先將字符串轉化成數組,[]byte 或 []rune,而後再轉換成 string型。字符串

 

對於全是ASCII編碼的字符串:string

func main() { str:="abc" s2:=[]byte(str) s2[0]='b' fmt.Println(string(s2)) //bbc }

 

對於包含非ASCII編碼的字符串:

func main() { str:="白貓" s2:=[]rune(str) s2[0]='黑' fmt.Println(string(s2)) //黑貓 }

上面使用到的 string(),表示強制類型轉換,轉換爲字符串。

 

本篇主要介紹 byte 和 rune 兩種類型的字符,涉及到的for循環和強制類型轉換能夠簡單瞭解下,有編程基礎的很容易懂。

相關文章
相關標籤/搜索