背景
这篇文章是我看 幼麟实验实验-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])