首先說一下go中的字串類型:
字串就是一串固定長度的字元串連起來的字元序列。Go的字串是由單個位元組串連起來的。Go語言的字串的位元組使用UTF-8編碼標識Unicode文本。
- Go語言的字串的位元組使用UTF-8編碼標識Unicode文本,這樣Golang統一使用UTF-8編碼,中文亂碼問題不會再困擾程式員。
- 字串一旦賦值了,字串就不能修改了:在Go中字串是不可變的。
下面介紹字串的三種遍曆方式,根據實際情況選擇即可。
常規遍曆方式:
var str = "Hello world!" for i := 0; i < len(str); i++ { fmt.Printf("str[%d]=%c\n", i, str[i]) }
運行結果:
image
該遍曆方式==缺點==:遍曆是按照位元組遍曆,因此如果有中文等非英文字元,就會出現亂碼,比如要遍曆"abc北京"這個字串,效果如下:
image
可見這不是我們想要的效果,根據utf-8中文編碼規則,我們要str[3]str[4]str[5]三個位元組合起來組成“北”字及 str[6]str[7]str[8]合起來組成“京”字。由此引出下面第二種遍曆方法。
for-range遍曆方式:
該方式是按照字元遍曆的,所以不會出現亂碼,如下:
var str = "abc北京" for i, ch := range str { fmt.Printf("str[%d]=%c\n", i, ch) }
運行結果:
image
可以看到第二個漢子“京”的開始下標是6,直接跳過了4和5,可見確實依照utf8編碼方式將三個位元組組合成了一個漢字,str[3]-str[5]組合成“北”字,str[6]-str[8]組合成了“京”字。
由於下標的不確定性,所以引出了下面的遍曆方式。
切片遍曆方式
1 可以先將字串轉成 []rune 切片
2 再用常規方法進行遍曆
//樣本 var str = "abc北京" str2 := []rune(str) for i := 0; i < len(str2); i++ { fmt.Printf("str[%d]=%c\n", i, str2[i]) }
運行效果:
image
由此可見下標是按1遞增的,沒有產生跳躍現象。