字符()字符串指的是所有8位字节字符串的集合,通常(不需要)是编码文本。字符串可以为空,但不能。长度确定编译时的长度,并且值是不可变的。。
字符串本质上是字符串数组的字符串。每个字符对应于存储期间一个或多个整数。字符集的编码方法是多少。
编译字符串时,该类型在运行时定义为结构,该结构位于袋中:
根据在运行时的字符串定义,在程序运行过程中,字符串存储长度()和指向实际数据的指针()。
所有文件均编码,字符常数也使用编码字符集。一个英文字母为1个字节长度,一个中文帐户为3个字节长度。go中的字符串长度是指字节长度,而不是数字角色,这与动态语言的表现不同。
有一个特殊的类型-rune type(),用于表示字符串中的字符。字符串的长度,您可以首先将字符串转换为类型,也可以在标准库中使用该功能。
当您穿越弦时,遍历不再是单个字节,而是一个符文。
在短语的分析阶段中,通过扫描源代码将双引号和反吸引数字的内容识别为标准字符串和原始字符串:
然后,将不断扫描下一个字符,直到扫描结束为止直到另一个双引号编号和反诱导的数字。通过将解析字节转换为字符串,将扫描到扫描内容的内容类型()扫描到扫描的内容中。
字符串可以通过:
在编译阶段构建抽象语法树时,名称的右侧将被解析为添加到字符串的expression()节点,这是该表达式的操作。加法的附加字符串被解析为列表节点并分配给表达式:
在构造抽象语法树时,它将穿越整个语法树的表达。在遍历过程中,可以识别操作的类型,并且将要求使用String Plus方法的类型进行进一步处理:
首先计算添加的字符串数。如果添加的字符串数小于2,则将报告一个错误。接头,将添加添加字符串字节的添加。如果字符串的总字节长度小于32,它将通过堆栈空间打开32个字节的缓存空间。
如果用于添加的字符串的数量小于5,则调用运行时的字符串缝合函数。否则,调用运行时函数并将字符串通过slice的形式传递。类型检查中的方法找到字符串在运行时缝合功能,并将其构建为呼叫表达式,操作是操作,并且最终将呼叫表达式完成以完成呼叫。中间的呼叫最终将调用该函数。
已经有一个带有32个字节的临时高速缓存空间,并且缓存空间的第一个地址通过函数用作字符串的地址,并且字节的长度用作字符串的长度。如果缝合字符串的长度大于32个字节,则将调用该函数。该函数将在字符串的字符串中分配存储空间,并将存储空间的地址指向字符串。可以看到字符串的底层是字节切片,并指向同一内存区域。分配存储后空间并完成指针点,将通过内存将要剪接的字符串切片复制到分布式存储空间。
尽管字符串的底层是字节数组,但字节数组和字符串的相互转换不是一个简单的指针引用,而是涉及内存复制。字符串大于32个字节时,有必要申请堆内存内存。。
当字符串转换为字节切片时,需要调用函数。当字符串小于32个字节时,可以直接使用缓存,但是当字节的长度大于或等于32时,该函数需要从桩区域施加足够的内存空间,然后将字符串置于通过内存副本的目标地址。
当字节切片转换为字符串时,原理与上面相同。因此,字符串和切片的转换涉及内存复制。在某些密集的转换方案中,需要评估转换带来的性能损失。
原始:https://juejin.cn/post/7101029097626664968