Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang rune和byte

Golang中rune和byte的使用与区别

作者:李歘歘

rune和byte都是Go语言中表示单个字符的类型,本文就来介绍一下Golang中rune和byte的使用与区别,具有一定的参考价值,感兴趣的可以了解一下

在Go语言中,runebyte都是表示单个字符的类型,但它们有一些关键的区别。

byte 类型

byte 是 uint8 的别名,即一个 8 位无符号整数,表示一个字节,范围是 0 到 255。

字符占用字节数:

byte 表示:字符串 "你",它在 Go 中的 UTF-8 编码是 0xE4, 0xBD, 0xA0(十六进制)。

s := "你"
for i := 0; i < len(s); i++ {
    fmt.Printf("byte at index %d: %d\n", i, s[i])
}

输出:

byte at index 0: 228
byte at index 1: 189
byte at index 2: 160

rune 类型

rune 是 int32 的别名,即一个 32 位有符号整数,用于表示一个 Unicode 字符。Go中所有字符(包括 ASCII 和 Unicode 字符)都是以 rune 类型表示的,范围是 0 到 0x10FFFF。

rune 表示:

s := "你"
for _, c := range s {
    fmt.Printf("rune: %c, rune value: %d\n", c, c)
}

输出:

rune: 你, rune value: 20320

这表示 "你" 的 Unicode 编码点(20320,即 0x4F60)被 rune 类型存储。

UTF-8 与 Unicode 的关系

byte和rune的主要区别

特性byterune
类型uint8 (8-bit unsigned int)int32 (32-bit signed int)
用途处理 ASCII 或字节数据处理 Unicode 字符
表示范围0 到 2550 到 0x10FFFF
常见应用字节流、ASCII字符Unicode字符(包括多字节字符)
存储大小1 字节4 字节
字符集支持仅支持 ASCII 字符支持所有 Unicode 字符

Go的默认编码方式

Go 字符串默认的编码方式是 UTF-8 。所以默认使用 byte 序列来表示字符串中的每个字符。

具体来说,Go 中的字符串(string 类型)是由 UTF-8 编码的字节序列 组成的。因此:

s := "a"
fmt.Print("占用字节数:", len(s))
fmt.Printf(";类型:%T  ", s[0])
fmt.Println()
s1 := "你"
fmt.Print("占用字节数:", len(s1))
fmt.Printf(";类型:%T  ", s1[0])

输出:

占用字节数:1;类型:uint8  
占用字节数:3;类型:uint8  

遍历方式

遍历 byte

bytes := []byte(s)可以直接将字符串转为byte,当然也可以遍历:

package main

import "fmt"

func main() {
	s := "你" // 包含中文字符

	// 按字节遍历字符串
	fmt.Println("按字节遍历字符串:")
	for i := 0; i < len(s); i++ {
		fmt.Printf("s[%d] = %v (类型: %T)\n", i, s[i], s[i]) // 输出每个字节的值
	}
}

输出:

按字节遍历字符串:
s[0] = 228 (类型: uint8)
s[1] = 189 (类型: uint8)
s[2] = 160 (类型: uint8)

遍历 rune

runes := []rune(s)可以直接将字符串转为rune,当然也可以遍历:

package main

import "fmt"

func main() {
	s := "你"

	// len(s) 返回字节数
	fmt.Println("len(s) =", len(s)) // 输出:3,因为“你”是由 3 个字节表示

	// 使用 range 遍历字符串,按字符(rune)遍历
	fmt.Println("使用 range 遍历字符串,按字符(rune)遍历:")
	for i, r := range s {
		fmt.Printf("i = %d, r = %v (类型: %T)\n", i, r, r)
	}
}

输出:

len(s) = 3
使用 range 遍历字符串,按字符(rune)遍历:
i = 0, r = 20320 (类型: int32)

补充

for i := range s 的 s[i] 其实也是byte,但是处理中文时候会存在问题。

package main

import "fmt"

func main() {
	s := "你" // 字符串包含中文字符

	// 使用 range 遍历字符串
	fmt.Println("使用 range 遍历字符串:")
	for i := range s {
		fmt.Printf("s[%d] = %v (类型: %T)\n", i, s[i], s[i]) // 打印每个字节的值
	}
}

输出:

使用 range 遍历字符串:
s[0] = 228 (类型: uint8)

字符还原

要从 byte 序列或 rune 序列还原回原始字符串,你可以通过以下方式进行操作:

从 byte 序列还原字符串

package main

import "fmt"

func main() {
	s := "你好" // 字符串 "你好"

	// 将字符串转换成 rune 切片
	bytes := []byte(s)

	fmt.Println("bytes:", bytes)
	// 将 rune 切片转换回字符串
	s1 := string(bytes)
	fmt.Println("还原的字符串:", s1)
}

bytes: [228 189 160 229 165 189]
还原的字符串: 你好

从 rune 序列还原字符串

package main

import "fmt"

func main() {
	s := "你好" // 字符串 "你好"

	// 将字符串转换成 rune 切片
	runes := []rune(s)

	fmt.Println("runes编码:", runes)
	// 将 rune 切片转换回字符串
	s1 := string(runes)
	fmt.Println("还原的字符串:", s1)
}


runes编码: [20320 22909]
还原的字符串: 你好

到此这篇关于Golang中rune和byte的使用与区别的文章就介绍到这了,更多相关Golang rune和byte内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文