Go-string(Go学习笔记)

210 阅读3分钟

背景

这篇文章是我看 幼麟实验实验-Golang合辑 的学习笔记,有点类似于视频的文字版吧,该文章里的图片也是截取视频里面的,再加上自己的一些标注。这个视频合辑适合有 Go 基础的同学看哈,所以文章也一样呢!有不正确的地方欢迎大家指正呀~

strings

一个比特可以是 0 或 1,八个比特组成一个字节。全为 0 时,代表数字 0,全为 1 时,代表数字 255。一个字节可以表示 256 个数字,两个字节可以表示 65536 个数字。

字符集

字符集为每个字符分配一个唯一的编号

Unicode 是一套字符集

Unicode 可以使用的编码方案有三种,分别是:

  • UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;(浪费内存)
  • UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;(需划分字符边界)
  • UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。

UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。

请问地址 FFE1 上字节的值是多少?如果你试图回答一个结果,那就是错的。为什么?因为我还没有告诉你这个字节表示什么。我还没有告诉你类型信息。

如果我说上述字节表示一个数字会怎么样呢?你可能会回答 10,那么你又错了。为什么?因为当我说这是数字的时候,你认为我是指十进制的数字。

以上字符集的内容是从 简书作者:没我找不到电子书 处引用的,看这篇文章会更加容易理解字符集哟

Go 语言默认的编码方式:UTF-8

存储内容:

字符串类型的编码结构:

如:s1 := "eggo 世界"

s1 存字符串的起始位置和该字符串字节的长度

fmt.Printf("%c\n", sl[2]) 可以读取字符串的内容

s1[2] = 'o' 但不允许这样修改它,一部分原因是:Go 语言认为字符串内容是不会被修改的,所以它的编译器会把这样定义的字符串内容分配到只读内存段。

内存中这些读、写、执行等权限是为了保护程序正常运行,但是也限制我们不能修改只读的内容。

另外,字符串变量是可以共用底层字符串内容的

如图所示:

当 s1 修改了内容,s2 的内容也会被修改,这样的影响是不可以预测的。

如果非要修改,可以给变量整体赋新值,它存储的地址就会指向新的内容,并没有去修改“原来”的内存。

s1 = "hello"

也可以把变量强制类型转换成字节 slice,这样会为 slice 变量重新分配一段内存,并且会拷贝原来字符串的内容,同样可以脱离只读内存的限制。

bs := ([]byte)(s1)

bs[2] = 'o'

fmt.Printf("%c\n", bs[2])