[Go] GO中的字符串底层数据结构
2023-02-18 15:37:01 时间
一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于Go语言的源代码要求是UTF8编码,导致Go源代码中出现的字符串面值常量一般也是UTF8编码的。源代码中的文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。
字符串的底层数据结构:
type StringHeader struct { Data uintptr Len int }
字符串结构由两个信息组成:第一个是字符串指向的底层字节数组,第二个是字符串的字节的长度。字符串其实是一个结构体,因此字符串的赋值操作也就是reflect.StringHeader结构体的复制过程,并不会涉及底层字节数组的复制
下面是"hello, world"的内存结构:
下面是"Hello, 世界"的内存结构:
里面的中文部分是0xE4 0xB8 0x96 0xE7 0x95 0x8C 这六个字节 , 16进制表示的
内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目)
rune是utf8编码的每一个的字符
因为要维护字符串的只读属性 , 字符串相关的强制类型转换主要涉及到[]byte和[]rune两种类型, 每个转换都可能隐含重新分配内存的代价,最坏的情况下它们的运算时间复杂度都是O(n)
相关文章
- GitlabRunner+K8S 实现自动化发布
- C/C++ Qt StandardItemModel 数据模型应用
- GIT分布式版本控制系统 | 命令讲解入门
- Linux自动挂载 (autofs)
- Linux 计划任务
- NFS (网络文件系统) | CentOS7 升级系统和内核 | Linux man 命令汉化
- Linux快捷键 | 破解密码 | 正则 | 永久行号显示
- Linux权限管理
- Linux用户账号管理
- Linux逻辑分区| 扩容 | 挂载
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- Linux基础命令
- Linux 基础篇 vim | 网卡
- Linux网络管理 | 三种模式
- Linux打包 | 压缩
- Linux进程管理
- Linux防火墙 | 服务管理
- Linux基础篇
- Linux vim | vi 的使用