Go | 初步了解「字元」型別
💬 簡介
在 Go 語言中,字元型別是處理文本資料的基礎。提供了兩種主要的字元型別:byte
和 rune
。這兩者都用來處理字元資料,但它們的範圍和用途有所不同。理解這兩種型別的特性將幫助更有效地處理文本,並能避免在處理多字節字元(如 Unicode)時遇到的問題。
在本篇文章中,我們將介紹 byte
和 rune
的基本概念,並展示它們如何運作。
圖片來源: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
11package 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
18package 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️⃣ byte
與 rune
的區別
byte
用於處理 ASCII 字元,通常是單字節(8 位元)。rune
用於處理 Unicode 字元,能表示更廣泛的字元集,且占用 32 位元。
4️⃣ 轉換 byte
與 rune
由於 byte
和 rune
都與字元有關,在某些情況下,我們可能需要進行類型轉換:
- 從
byte
轉換為rune
:將一個單字節字元轉換為 rune 型別來處理,通常用於 ASCII 字元。 - 從
rune
轉換為byte
:將一個 Unicode 字元(rune)轉換為 byte 只適用於單字節字元(例如 ASCII)。
- 範例:轉換 byte 與 rune
1 | package main |
📝在這個範例中,
byte
和rune
之間的轉換展示了如何處理單字節字元和多字節字元。需要注意的是,將一個 Unicode 字元(rune
)轉換為byte
會丟失資訊,因為byte
只能表示單字節字元。
解釋
- 1️⃣ 了解
rune
的值
假設我們有一個rune
變數,其值為28450
(這是漢
字的 Unicode 編碼值,十進制數字)。其對應的 32 位二進制表示是:這是 32 位的二進制數字,對應 rune 變數的數值。1
28450 = 00000000 00000000 01101111 00100010 (二進制表示)
- 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️⃣ 了解
⚠️ 注意事項
1️⃣ 選擇正確的型別:
在處理字元時,應根據需要選擇正確的型別。對於 ASCII 字元,使用 byte
是高效且適當的;如果需要處理多語言字元(如中文、日文),則應使用 rune
。
2️⃣ 處理編碼問題:
在處理 Unicode 字元時,記得選擇合適的編碼方式(例如 UTF-8、UTF-16)。Go 語言的 rune
是基於 UTF-32 編碼,但在實際應用中,字元串通常是 UTF-8 編碼。
🎯總結
字元型別主要有 byte
和 rune
兩種。byte
用於表示單字節字元,通常用來處理 ASCII 字元,而 rune
則用來表示多字節字元,主要處理 Unicode 字元,適用於處理來自世界各地語言的字符。理解這兩者的差異及使用場景,能夠幫助有效選擇合適的型別,提升程式處理文本資料的效率。
建議在處理 ASCII 字元時使用 byte
,而在處理國際化字符時,應選擇 rune
。掌握這些基本型別的選擇與轉換,可以在開發中避免字符處理的錯誤,確保程式的穩定運行。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go