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

embedded/2024/10/21 11:47:07/

在 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 字符的场景,尤其是涉及多语言文本处理时。

http://www.ppmy.cn/embedded/56071.html

相关文章

动态规划精品课 2024.6.26-24.7.3

一、斐波那契数列模型 0、第N个泰波那契数 class Solution {public int tribonacci(int n) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回结果// 处理边界情况if (n 0)return 0;if (n 1 || n 2)return 1;int[] dp new int[n 1];dp[0] 0;dp[1] dp[2] 1;for (int i…

【计算机网络】应用层(作业)

1、万维网上的每个页面都有一个唯一的地址&#xff0c;这些地址统称为&#xff08;A&#xff09;。 A. 统一资源定位符URLB. IP地址C. 域名地址D. WWW地址 解析&#xff1a; 2、下列TCP/IP应用层协议中&#xff0c;可以使用传输层无连接服务的是&#xff08;D&#xff09;。…

Java list stream 常用方法

Sorted 根据字符长短排序 public class Java8Demo1 {public static void main(String[] args) {// Sort by length of the words.List<String> list Arrays.asList("1234","456","abefc");List<String> list1 list.stream().sor…

算法基础-----【动态规划】

动态规划(待完善) 动规五部曲分别为&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式&#xff08;状态转移公式&#xff09;dp数组如何初始化确定遍历顺序举例推导dp数组、 动态规划的核心就是递归剪枝&#xff08;存储键值&#xff0c;…

K210视觉识别模块学习笔记6: 识别苹果_图形化操作函数_

今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习如何在识别到目标的时候添加图形化操作:(获取坐标、框出目标等) 在识别苹果的基础上 学习与添加 这些操…

Java SE入门及基础(62) 线程池 执行器

线程池 1. 执行器 In all of the previous examples, theres a close connection between the task being done by a new thread, as defined by its Runnable object, and the thread itself, as defined by a Thread object. This works well for small applications, but…

AI 与 Python 实战干货:基于深度学习的图像识别

《AI 与 Python 实战干货&#xff1a;基于深度学习的图像识别》 今天咱不啰嗦&#xff0c;直接上干货&#xff01; 在 AI 领域&#xff0c;特别是图像识别方面&#xff0c;Python 简直是一把利器。咱就以手写数字识别为例&#xff0c;来看看怎么用 Python 实现一个深度学习模…

【mybatis】mybatis-plus简单使用

1、简介 MyBatis-Plus&#xff08;简称MP&#xff09;是MyBatis的增强工具&#xff0c;它在MyBatis的基础上进行了扩展&#xff0c;以简化开发、提高效率。本案例是一个MyBatis-Plus的简单使用案例&#xff0c;包括项目的初始化、配置、实体类、Mapper接口以及基本的CRUD操作。…