您的位置:首页 > 文旅 > 美景 > golang string、byte[]以及rune的基本概念,用法以及区别

golang string、byte[]以及rune的基本概念,用法以及区别

2024/12/22 23:17:20 来源:https://blog.csdn.net/Mint6/article/details/140015883  浏览:    关键词:golang string、byte[]以及rune的基本概念,用法以及区别

在 Go 语言中,stringbyte[]rune 是处理文本和字符的三种不同数据类型。它们有各自的用途和特点,下面将详细介绍它们的基本概念、用法以及区别。

1. string

基本概念
  • 字符串类型string 是 Go 语言中的一种基本类型,用于表示一系列字节序列。
  • 不可变:字符串在 Go 中是不可变的,也就是说,一旦创建,字符串的内容就不能被修改。
  • UTF-8 编码:在 Go 中,字符串默认采用 UTF-8 编码,这意味着可以包含任意 Unicode 字符。
用法
  • 字符串用双引号 (") 或反引号 (``) 包裹。
  • 可以用字符串切片访问单个字节或子串。
示例
package mainimport "fmt"func main() {var str string = "Hello, 世界"fmt.Println(str) // 输出: Hello, 世界// 访问字符串的某个字节fmt.Printf("First byte: %c\n", str[0]) // 输出: H// 获取字符串长度(字节长度)fmt.Println("Length in bytes:", len(str)) // 输出: 13// 遍历字符串中的每个字节for i := 0; i < len(str); i++ {fmt.Printf("%c ", str[i])}// 输出: H e l l o ,   ä¸ ç // 遍历字符串中的每个 Unicode 字符for _, r := range str {fmt.Printf("%c ", r)}// 输出: H e l l o ,   世 界
}
特点
  • 不可变:不能修改字符串中的某个字符或字节。
  • 支持 UTF-8 编码,可以直接处理 Unicode 字符。
  • 可以通过 len() 获取字符串的字节长度。

2. byte[]

基本概念
  • 字节切片byte 是一个无符号 8 位整数(uint8),byte[] 是一个 byte 类型的切片(slice)。
  • 表示原始数据:常用于表示原始的二进制数据,如文件内容、网络数据包等。
  • ASCII 或单字节编码:可以用于处理 ASCII 字符或单字节字符集的字符串。
用法
  • 用于需要直接操作字节数据的场景。
  • 可以用 []byte 将字符串转换为字节切片,反之亦然。
示例
package mainimport "fmt"func main() {var byteArray []byte = []byte{'H', 'e', 'l', 'l', 'o'}fmt.Println(byteArray) // 输出: [72 101 108 108 111]str := "Hello, 世界"byteArray = []byte(str)fmt.Println(byteArray) // 输出: [72 101 108 108 111 44 32 228 184 150 231 149 140]// 修改字节切片中的某个字节byteArray[0] = 'h'fmt.Println(string(byteArray)) // 输出: hello, 世界
}
特点
  • 可变:可以修改切片中的字节。
  • 适合处理二进制数据和需要频繁操作的字节序列。
  • 可以方便地与字符串互相转换。

3. rune

基本概念
  • Unicode 码点rune 是一个 32 位的整数(int32),用于表示一个 Unicode 码点。
  • 字符类型:在 Go 中,rune 用于表示一个字符(不局限于单个字节的字符)。
  • 支持所有 Unicode 字符:包括多字节字符,这对于处理国际化文本非常重要。
用法
  • 用于需要逐个处理 Unicode 字符的场景。
  • 可以将字符串转换为 rune 切片,以便操作和处理每个字符。
示例
package mainimport "fmt"func main() {var runeChar rune = '世'fmt.Printf("%c\n", runeChar) // 输出: 世str := "Hello, 世界"runeArray := []rune(str)fmt.Println(runeArray) // 输出: [72 101 108 108 111 44 32 19990 30028]// 修改 rune 切片中的某个字符runeArray[7] = '界'fmt.Println(string(runeArray)) // 输出: Hello, 界界
}
特点
  • 每个 rune 表示一个 Unicode 字符。
  • 用于处理多字节字符和 Unicode 文本。
  • 可以通过 rune 切片遍历和操作字符串中的每个字符。

区别总结

特性stringbyte[]rune
数据类型不可变的字符串可变的字节切片可变的 rune(字符)切片
单位UTF-8 字符串单个字节Unicode 码点(字符)
主要用途存储和操作文本数据操作原始二进制数据或单字节字符处理和操作 Unicode 字符
可变性不可变可变可变
访问方式按字节或字符(rune)访问按字节访问按字符(rune)访问
示例"Hello, 世界"[]byte{'H', 'e', 'l', 'l', 'o'}[]rune{'H', '世'}

使用场景

  • string:用于大多数文本处理场景,尤其是需要支持 Unicode 的地方。
  • byte[]:用于处理二进制数据或需要直接操作字节的场景,例如文件操作、网络通信等。
  • rune:用于需要处理和操作 Unicode 字符的场景,尤其是涉及多语言文本处理时。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com