C++|Golang 语言怎么高效使用字符串?( 三 )


先阅读 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