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


本篇內容本來准備在上一篇寫的,想了想還是拆開寫。

 

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

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

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

 

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

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

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

 

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

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

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

 

修改字符串

所謂對字符串的修改其實不是對字符串本身的修改,而是復制字符串,同時修改值,即重新分配來內存。

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

 

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

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循環和強制類型轉換可以簡單了解下,有編程基礎的很容易懂。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM