這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在Go
語言中,字串就是一個唯讀(read-only
)的,可以包含任意位元組(byte
)的切片(slice
)。由於Go
源碼檔案都是使用UTF-8
編碼的,所以直接在源碼中輸入的字串也都是用UTF-8
編碼的(前提是字串裡沒有byte-level escapes
,即位元組層面上的轉義)。請看下面這個例子:
package mainimport "fmt"func main() { s := "日誌log" fmt.Println(len(s))}
執行結果:
9
s
是一個UTF-8
編碼的字串,“日誌
”兩個漢字各占3
個位元組,所以一共是9
個位元組。
再看一個例子:
package mainimport "fmt"func main() { s:="\xFF\xFF" fmt.Println(len(s))}
執行結果:
2
雖然0xFF
不是一個合法的UTF-8
編碼字元,但是因為字串可以包含任意位元組,所以s
仍是一個合法的字串。
Go
語言引入rune
類型(實際就是int32
)來表示字元(character
),“日誌log
”這個字串包含了5
個字元,9
個位元組。 可以用for range
迴圈來遍曆UTF-8
編碼字串的每個字元:
package mainimport "fmt"func main() { s := "日誌log" for index, runeValue := range s { fmt.Printf("%#U starts at byte position %d\n", runeValue, index) }}
執行結果:
U+65E5 '日' starts at byte position 0U+5FD7 '志' starts at byte position 3U+006C 'l' starts at byte position 6U+006F 'o' starts at byte position 7U+0067 'g' starts at byte position 8
參考資料:
Strings, bytes, runes and characters in Go。