经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[Go] GO中的字符串底层数据结构
来源:cnblogs  作者:陶士涵  时间:2020/12/28 9:54:51  对本文有异议

一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于Go语言的源代码要求是UTF8编码,导致Go源代码中出现的字符串面值常量一般也是UTF8编码的。源代码中的文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。

字符串的底层数据结构:

  1. type StringHeader struct {
  2. Data uintptr
  3. Len int
  4. }

字符串结构由两个信息组成:第一个是字符串指向的底层字节数组,第二个是字符串的字节的长度。字符串其实是一个结构体,因此字符串的赋值操作也就是reflect.StringHeader结构体的复制过程,并不会涉及底层字节数组的复制

下面是"hello, world"的内存结构:

 

 下面是"Hello, 世界"的内存结构:

 

里面的中文部分是0xE4 0xB8 0x96 0xE7 0x95 0x8C 这六个字节 , 16进制表示的

内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目) 

rune是utf8编码的每一个的字符

 

因为要维护字符串的只读属性 , 字符串相关的强制类型转换主要涉及到[]byte和[]rune两种类型, 每个转换都可能隐含重新分配内存的代价,最坏的情况下它们的运算时间复杂度都是O(n)

原文链接:http://www.cnblogs.com/taoshihan/p/14187686.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号