[Go] GO中的字符串底层数据结构

一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于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)

(0)

相关推荐

  • 程序员技能必备几分钟搞懂各种编码内附汉字码实操案例

    背景 HTTP 协议基于文本传输,字符编码将文本变为二进制,二进制编码将二进制变为文本.TCP 协议基于二进制传输,数据读取时需要处理字节序.本文将介绍常见的字符编码.二进制编码及字节序,并一探 Go ...

  • 数据库中的字符串拼接

    日常工作中,时常需要将两个或多个字符串拼接在一起,组合成一个新的字符串.而字符串拼接地实现在各个关系型数据库中略有差异. 1.Oracle中,使用 "||"拼接符或concat函数 ...

  • 面试题-python3 找出两个字符串中最大公共子字符串

    前言 算法题(语言不限): 找出两个字符串中最大公共子字符串,如"abjeccarde","sjdgcargde"的最大子串为"car" 最 ...

  • 小事中暴露的底层性格(识人)

    点关注,不迷路!专注发布体制内职场.时政动态,公文写作 善于从别人的言谈举止中,去识透对方,可以避免很多麻烦. 1.说话暧昧的人――大多都是想迎合他人 这种人处世圆滑,从不肯吃半点亏,懂得如何保护自己 ...

  • 企业重大决策中的财税底层逻辑

    遇到重大事项,企业决策者必须在有限的时间内做出决定或者做出选择,其中财税因素的影响变得日益重要,在十余年的财税咨询经历中,常常需要从财税角度协助决策者做出决定和选择,我常常反思自己作为财税专业人士的财 ...

  • java 集合中Set接口、数据结构

    集合中Set接口.数据结构 .Set接口 实现类 HashSet HashSet的特征 LinkedHashSet TreeSet 自然排序 数据结构 哈希表 哈希冲突 散列算法 二叉树 .Set接口 ...

  • vxworks中常用的各种数据结构总结

    一: 基本数据结构 typedef struct node/* Node of a linked list. */ { struct node *next;/* Points at the next  ...

  • 说说Python中连接字符串用join还是+?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • JS的7种数据类型以及它们的底层数据结构

    年纪大了记性不好(其实是脑子不好使,但又不想承认),有些东西总是容易忘,所以为了便于之后查看干脆记下来,用自己的语言再把一些概念整理一下,都是自己写的,以后再看这些文字也会有亲切感(好像很有道理的亚子 ...

  • 如何在Java中填充字符串?

    如何在Java中填充字符串?