先阅读 reflect 中 StringHeader 和 SliceHeader 的数据结构:
阅读上面这段代码 , 我们可以发现 StringHeader 和 SliceHeader 的字段只缺少一个表示容量的字段 Cap , 二者都有指向存储数据的字节数组的指针和长度 。 我们只需要通过使用 获取内存地址 , 就可以实现在原内存空间修改数据 , 避免了内存分配和数据拷贝的开销 。
unsafe.Pointer
因为 StringHeader 比 SliceHeader 缺少一个表示容量的字段 Cap , 所以通过 将 转换为 没有问题 , 但是反之就不行了 。 我们需要补上一个 Cap 字段 , 并且将字段 Len 的值作为字段 Cap 的默认值 。
阅读上面这段代码 , 我们可以发现通过使用 把字符串转换为字节切片 , 可以做到零拷贝 , str 和 str2 共用同一块内存 , 无需新分配一块内存 。 但是需要注意的是 , 转换后的字节切片仍然不能修改 , 因为在 Golang 语言中字符串是只读的 , 通过索引下标修改会引发 panic 。
总结
本文我们介绍了怎么高效使用 Golang 语言中的字符串 , 先是介绍了字符串在 runtime 中的数据结构 , 然后介绍了字符串拼接的几种方式 , 字符串与字节切片零拷贝互相转换 , 还通过示例代码证明了字符串在 Golang 语言中是只读的 。 更多关于字符串的操作 , 读者可以阅读标准库 strings 和 strconv 了解更多内容 。
- 【C++|Golang 语言怎么高效使用字符串?】原文链接:https://mp.weixin.qq.com/s/Na5hQiuggifsHOEnw-2oXA
- C++|如何在工作之余增加收入?
- Java|嵌入式开发:开发实时 C++ 应用程序的5个技巧
- 人工智能语言|专家创建“新图灵测试” 能够更好评估人工智能的隐秘能力
- |华为正式确认,自研编程语言要来了,任正非:向下扎到根
- 华为“新技术”确定,自研编程语言今年发布,有望从根本上突破!
- c语言|违反常识,却很正确:创业就是要细分垄断
- C++|亚马逊不可靠?跨境电商卖家要注意了,封店潮有第一次就有第二次
- C++|618高端机销量排名:小米第2,华为第4,榜首无可撼动
- C++|反超小米和荣耀,斩获3K档性价比第一,配置“天花板”
- c语言|大半个互联网,都在“追杀”小红书