Like Share Discussion Bookmark Smile

J.J. Huang   2025-01-25   Getting Started Golang 01.基本型別   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解「字元」型別

💬 簡介

在 Go 語言中,字元型別是處理文本資料的基礎。提供了兩種主要的字元型別:byterune。這兩者都用來處理字元資料,但它們的範圍和用途有所不同。理解這兩種型別的特性將幫助更有效地處理文本,並能避免在處理多字節字元(如 Unicode)時遇到的問題。

在本篇文章中,我們將介紹 byterune 的基本概念,並展示它們如何運作。

圖片來源:Gophers(地鼠造型的原創者為 Renee French)


🔎 Go 語言中的字元型別

1️⃣ byte - 單字節字元

byte 是 Go 語言中對 uint8 型別的別名,通常用來表示單字節字元,這些字元通常是 ASCII 字元。每個 byte 可以儲存一個 8 位元的數值,並且範圍是 0 到 255。byte 通常用於處理二進制資料或純文本資料。

  • 範例:處理 ASCII 字元
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package main

    import "fmt"

    func main() {
    var a byte = 'A' // 存儲 ASCII 字元 'A'
    fmt.Println(a) // 輸出:65('A' 的 ASCII 值)

    var b byte = 66 // 使用數字表示字元
    fmt.Println(string(b)) // 輸出:B
    }

    📝在這個範例中,byte 存儲的是單字節的 ASCII 字元,可以直接將字元或對應的數值進行操作。

2️⃣ rune - 多字節字元(Unicode)

rune 是 Go 語言中對 int32 型別的別名,用來表示一個 Unicode 字元。由於 Unicode 字元可能需要多個字節來表示,因此 rune 顯示的是一個 32 位元的整數,能夠處理來自全球各種語言的字元。它的範圍可以表示整個 Unicode 字元集。

  • 範例:處理 Unicode 字元
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package main

    import "fmt"

    func main() {
    // Unicode 編碼 U+6F22 對應的是 '漢' 字元
    var ch rune = '漢' // 存儲 Unicode 字元 '漢'

    // 顯示 '漢' 的 Unicode 編碼 U+6F22(十六進制)
    fmt.Printf("Unicode 編碼:U+%X\n", ch) // 輸出:U+6F22

    // 顯示 '漢' 的 Unicode 編碼的十進制表示
    fmt.Println("Unicode 編碼(十進制):", ch) // 輸出:28450

    // 將 rune 轉換為 string
    var chStr string = string(ch)
    fmt.Println("字元:", chStr) // 輸出:漢
    }

    📝在這個範例中,rune 用來表示一個 Unicode 字元(如漢字),它的大小是 32 位元,因此能夠儲存來自不同語言的字元。

3️⃣ byterune 的區別

  • byte 用於處理 ASCII 字元,通常是單字節(8 位元)。
  • rune 用於處理 Unicode 字元,能表示更廣泛的字元集,且占用 32 位元。

4️⃣ 轉換 byterune

由於 byterune 都與字元有關,在某些情況下,我們可能需要進行類型轉換:

  • byte 轉換為 rune:將一個單字節字元轉換為 rune 型別來處理,通常用於 ASCII 字元。
  • rune 轉換為 byte:將一個 Unicode 字元(rune)轉換為 byte 只適用於單字節字元(例如 ASCII)。
  • 範例:轉換 byte 與 rune
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
var b byte = 'A' // ASCII 字元
var r rune = rune(b) // 將 byte 轉換為 rune
fmt.Println(r) // 輸出:65

var r2 rune = '漢' // Unicode 字元
var b2 byte = byte(r2) // 只取低位的字節
fmt.Println(b2) // 輸出:34,這是 '漢' 的最低 8 位
}

📝在這個範例中,byterune 之間的轉換展示了如何處理單字節字元和多字節字元。需要注意的是,將一個 Unicode 字元(rune)轉換為 byte 會丟失資訊,因為 byte 只能表示單字節字元。

  • 解釋

    • 1️⃣ 了解 rune 的值
      假設我們有一個 rune 變數,其值為 28450(這是 字的 Unicode 編碼值,十進制數字)。其對應的 32 位二進制表示是:
      1
      28450 = 00000000 00000000 01101111 00100010 (二進制表示)
      這是 32 位的二進制數字,對應 rune 變數的數值。
    • 2️⃣ 提取 rune 的低 8 位
      現在,假設我們要將這個 rune(28450)轉換為 byte(8 位)。這樣做時,會把 rune 的 最低 8 位 提取出來,即:
      1
      低 8 位: 00100010
      00100010 這是 8 位的二進制數字,轉換為十進制就是 34。
    • 3️⃣ 結果
      這樣,將 rune 的值轉換為 byte 時,只保留了這 8 位,結果變成了 34,對應於 0x22(十六進制表示)。
      所以,這是為什麼:
      1
      var b2 byte = byte(r2)
      會輸出 34,因為 rune 的低 8 位對應於十進制的 34

⚠️ 注意事項

1️⃣ 選擇正確的型別:

在處理字元時,應根據需要選擇正確的型別。對於 ASCII 字元,使用 byte 是高效且適當的;如果需要處理多語言字元(如中文、日文),則應使用 rune

2️⃣ 處理編碼問題:

在處理 Unicode 字元時,記得選擇合適的編碼方式(例如 UTF-8、UTF-16)。Go 語言的 rune 是基於 UTF-32 編碼,但在實際應用中,字元串通常是 UTF-8 編碼。


🎯總結

字元型別主要有 byterune 兩種。byte 用於表示單字節字元,通常用來處理 ASCII 字元,而 rune 則用來表示多字節字元,主要處理 Unicode 字元,適用於處理來自世界各地語言的字符。理解這兩者的差異及使用場景,能夠幫助有效選擇合適的型別,提升程式處理文本資料的效率。

建議在處理 ASCII 字元時使用 byte,而在處理國際化字符時,應選擇 rune。掌握這些基本型別的選擇與轉換,可以在開發中避免字符處理的錯誤,確保程式的穩定運行。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go