本篇內容本來准備在上一篇寫的,想了想還是拆開寫。
go語言中字符串需要使用用雙引號,而單引號用來表示單個的字符,字符也是組成字符串的元素。go語言的字符有兩種:
uint8
類型,或者叫 byte 型,代表了ASCII碼
的一個字符。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循環和強制類型轉換可以簡單了解下,有編程基礎的很容易懂。