《快学 Go 语言》第 7 课 —— 冰糖葫芦串

  • 时间:
  • 浏览:0
  • 来源:UU快3—全天最准大发快三

字符串还还可以 通过下标来访问内部内部结构字节数组具体位置上的字节,字节是 byte 类型

原文发布时间为: 2018-11-20

本文作者:码洞

本文来自云栖社区合作伙伴“码洞”,了解相关信息还还可以 关注“码洞”。

为了进一步方便读者理解字节 byte 和 字符 rune 的关系,我花了下面这张图

func main() {

在使用 Go 语言进行网络编程时,无缘无故 前要将来自网络的字节流转添加内存字符串,一块儿也前要将内存字符串转添加网络字节流。Go 语言直接内置了字节切片和字符串的相互转换语法。

那为哪些前要拷贝呢?之后字节切片的底层数组内容是还还可以 修改的,而字符串的底层字节数组是只读的,之后共享了,就会原困字符串的只读属性不再成立。

我想要使用下标来读取字符串指定位置的字节,但有你无法修改五种位置上的字节内容。之后你尝试使用下标赋值,编译器在语法上直接拒绝你。

让我们都 所说的字符通常是指 unicode 字符,我想要认为所有的英文和汉字在 unicode 字符集中前会 三个白 多唯一的整数编号,三个白 多 unicode 通常用 4 个字节来表示,对应的 Go 语言中的字符 rune 占 4 个字节。在 Go 语言的源码中还还可以 找到下面这行代码,rune 类型是三个白 多衍生类型,它在内存里面使用 int32 类型的 4 个字节存储。

-----------

func main() {

图片



使用「字符」串来表示字符串势必会浪费空间,之后所有的英文字符原先只前要 1 个字节来表示,用 rune 字符来表示一句话没人剩余的 3 个字节前会 零。为啥让「字符」串三个白 多多好处,那也非要否快速定位。

图片

从节省内存的宽度出发,你之后会认为字节切片和字符串的底层字节数组是共享的。为啥让事实前会 原先的,底层字节数组会被拷贝。之后内容很大,没人转换操作是前要一定成本的。



为解释这点,就前要了解字符串的内存形状,它不仅仅是前面提到的那个字节数组,编译器还为它分配了头部字段来存储长度信息和指向底层字节数组的指针,图示如下,形状非常例如于切片,区别是头部少了三个白 多容量字段。



对字符串进行 range 遍历,每次迭代出三个白 多变量 codepoint 和 runeValue。codepoint 表示字符起始位置,runeValue 表示对应的 unicode 编码(类型是 rune)。

字符串在内存形式上比较接近于切片,它也还还可以 像切片一样进行切割来获取子串。子串和母串共享底层字节数组。

其中 codepoint 是每个「字」的实在 偏移量。Go 语言的字符串采用 utf8 编码,中文汉字通常前要占用 3 个字节,英文只前要 1 个字节。len() 函数得到的是字节的数量,通过下标来访问字符串得到的是「字节」。

import "fmt"

-----------

import "fmt"

import "fmt"

字符串通常有有五种设计,有五种是「字符」串,有五种是「字节」串。「字符」串中的每个字前会 定长的,而「字节」串中每个字是不定长的。Go 语言里的字符串是「字节」串,英文字符占用 1 个字节,非英文字符占多个字节。这原困无法通过位置来快速定位出三个白 多完整的字符来,而前要通过遍历的最好的办法来逐个获取单个字符。

func main() {

-------

import "fmt"

--------

}

当让我们都 将三个白 多字符串变量赋值给原先字符串变量时,底层的字节数组是共享的,它却说浅拷贝了头部字段。

func main() {

之后字符串仅仅是字节数组,那字符串的长度信息是为啥在么在得到呢?却说字符串前会 字面量一句话,长度尚还还可以 在编译期计算出来,为啥让之后字符串是运行时构造的,那长度又是要怎样得到的呢?

func main() {