Golang中的rune類型是一個32位的整數類型(int32),它是用來表示Unicode碼點的。rune類型的值可以是任何合法的Unicode碼點,它通常用來處理字符串中的單個字符。
在Golang中,字符常量使用單引號來表示,例如 'a'。使用單引號表示的字符常量是一個rune類型的值。
可以使用內置的rune函數將字符串轉換為rune類型的切片。例如:
str := "Hello, 世界"
runes := []rune(str)
fmt.Println(runes)
輸出結果是
[72 101 108 108 111 44 114 117 110 101 19990 30028]
前面幾位72,101...與ascii碼H e l l o的值一一對應
其實unicode與ascii都是字符串對應的計算機碼用的,Unicode是為了補充ascii的不足(畢竟ascii碼不包含中文)
可以使用內置的len函數獲取rune類型切片的長度,該長度表示字符串中的字符數量。例如:
str := "Hello, 世界"
runes := []rune(str)
fmt.Println(len(str),len(runes))
輸出結果分別是12與8
str := "Hello, 世界"
for i := 0; i < 12; i++ {fmt.Printf("%c",str[i])
}
//輸出結果Hello, ???
在輸出中,%c格式化動詞用于打印rune類型的值,將其表示為字符。
說明len(str)中文跟英文,所占的長度是不一樣的,中文占3個字節
而len(runes)返回的是字符串的個數
可以使用for循環遍歷rune類型切片,以便訪問字符串中的每個字符。例如:
for _, r := range runes {fmt.Printf("%c", r)
}
輸出結果為:Hello,世界
rune類型還可以轉換成string類型,例如:
var a rune = 'a'
fmt.Println(string(a))
var b []rune = []rune{'a','b'}
fmt.Println(string(b))
需要注意的是,因為rune類型是一個整數類型,所以可以進行算術和邏輯操作。
package mainimport "fmt"func main() {// 算術操作r1 := 'A'r2 := 'a'sum := r1 + r2diff := r1 - r2fmt.Printf("Sum: %c\n", sum)fmt.Printf("Difference: %c\n", diff)// 邏輯操作r3 := 'X'r4 := 'Y'logicalAnd := r3 & r4logicalOr := r3 | r4logicalXor := r3 ^ r4fmt.Printf("Logical AND: %c\n", logicalAnd)fmt.Printf("Logical OR: %c\n", logicalOr)fmt.Printf("Logical XOR: %c\n", logicalXor)
}
輸出值都是亂碼、或許在需要對稱加密場景下可以使用?
rune類型與Byte類型對比:
package mainimport "fmt"func main() {var a rune = '林'fmt.Println(a)//26519var b rune = 'a'fmt.Println(b)//97var c byte = 'a'fmt.Println(c)//97//var d byte = '林' //因為超出了值域會報錯,byte類型是0-255//fmt.Println(d)}
總結:rune
?用于處理單個字符,string
?用于處理字符串,byte
?用于處理單個字節。