go的string,byte和rune類型

rune是int32的別名類型,一個值就表明一個Unicode字符。
byte是uint8的別名類型,一個值就是一個ASCII碼值。
rune類型的值在底層都是由一個 UTF-8 編碼值來表達的。數組

瞭解下什麼是Unicode字符和ASCII碼:
一、簡單理解,咱們平時接觸到的中英日文,或者複合字符,都是Unicode字符。好比,'G'、'o'、'愛'、'好'、'者'就是一個個Unicode字符。
二、字符在計算機中存儲時須要使用二進制數來表示。因此人們定義了一張表,將咱們用到的字符用一個二進制數值表示。這就是ASCII碼錶的由來。ui

UTF-8 編碼方案會把一個 Unicode 字符編碼爲一個長度在 1\~4 之內的字節序列。因此,一個rune類型值表明了1\~4個長度的byte數組。編碼

案例:

spa

func main() {
    str := "Go愛好者"
    fmt.Printf("The string: %q\n", str)
    fmt.Printf("  => runes(char): %q\n", []rune(str))
    fmt.Printf("  => runes(hex): %x\n", []rune(str))
    fmt.Printf("  => bytes(hex): [% x]\n", []byte(str))
}

The string: "Go愛好者"
 => runes(char): ['G' 'o' '愛' '好' '者']
 => runes(hex): [47 6f 7231 597d 8005]
 => bytes(hex): [47 6f e7 88 b1 e5 a5 bd e8 80 85]

字符串值"Go愛好者"若是被轉換爲[]rune類型的值的話,其中的每個字符(不管是英文仍是中文)就都會獨立成爲一個rune類型的元素值。如打印出的第二行內容。
又因爲,每一個rune類型的值在底層都是由一個 UTF-8 編碼值來表達的,如第三行
把每一個字符的 UTF-8 編碼值都拆成相應的字節序列,如第四行,由於一箇中文字符的 UTF-8 編碼值須要用三個字節來表達。code

總結:
一個string類型的值既能夠被拆分爲一個包含多個字符的序列,也能夠被拆分爲一個包含多個字節的序列。前者能夠由一個以rune爲元素類型的切片來表示,然後者則能夠由一個以byte爲元素類型的切片表明。blog

image

相關文章
相關標籤/搜索