Go 字節 (byte) & 文字符號 (rune)


byte

通過 byte 定義一個字節,字節必須使用單引號包起來,直接打印字節輸出的是 ascii 碼,需要通過格式化輸出
byte 是 uint8 的別稱,使用 byte 主要是為了區分字節和無符號整型兩種類型
示例:

func main() {
	var a byte
	fmt.Printf("%v, type: %T, char: %c", a, a, a)
}

輸出:

0, type: uint8, char: 

rune

通過 rune 定義一個字符,字符必須使用單引號包起來
rune 是 int32 的別稱,使用 rune 主要是為了區分字符和整型兩種類型
示例:

func main() {
	var a rune
	fmt.Printf("%v, type: %T, char: %c\n", a, a, a)
}

輸出結果:

0, type: int32, char: 

byte & rune

byte 表示一個字節,可以表示英文字符等占用一個字節的字符,占用多於一個字節的字符就無法正確表示,例如占用 3 個字節的漢字
rune 表示一個字符,用來表示任何一個字符

示例:

func main() {
	a := "你好,hello"
	b := []byte(a)
	c := []rune(a)
	fmt.Printf("b: %v\ntype: %T\n\nc: %v\ntype: %T", b, b, c, c)
}

輸出結果:

b: [228 189 160 229 165 189 239 188 140 104 101 108 108 111]
type: []uint8

c: [20320 22909 65292 104 101 108 108 111]
type: []int32

可以看出 byte 並不能正確解析超過 1 byte 的字符,需要使用 rune

轉換

byte 和 rune 之間可以轉換,byte 轉向 rune 時不會出錯
但是 rune 轉向 byte 時會出現問題:
如果 rune 表示的字符只占用一個字符,不超過 uint8 時不會出錯;超過時直接轉換編譯無法通過,可以通過引用轉換,但是會舍去超出的位,出現錯誤結果
示例:

func main() {
	char := '你'
	v1 := rune(char)
	v2 := byte(char)
	s1 := strconv.FormatInt(int64(v1), 2)
	s2 := strconv.FormatInt(int64(v2), 2)
	fmt.Printf("v1: %c, type: %T, %v\n", v1, v1, s1)
	fmt.Printf("v2: %c, type: %T, %v\n", v2, v2, s2)
}

輸出結果:

v1: 你, type: int32, 100111101100000
v2: `, type: uint8, 1100000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM