string
1 .是一个指针,指向某个数组的首地址
[]byte
1 .是一个切片slice。一个封装了数组的结构体
2 .slice结构
type slice struct {
array unsafe.Pointer
len int
cap int
使用场景
1 .想要在本身原地修改,就只能使用[]byte
2 .string不能为nil,想要返回nil表达特殊含义,只能使用[]byte
3 .string可以直接比较,而[]byte不可以,所以[]byte不可以当map的key值。
4 .因为无法修改string中的某个字符,需要粒度小到操作一个字符时,用[]byte
5 .[]byte切片这么灵活,想要用切片的特性就用[]byte
6 .需要大量字符串处理的时候用[]byte,性能好很多
区别
1 .string的指针指向的内容是不可以改变的,所以每次更改一次字符串,都需要重新分配内存。之前的内存还需要GC收回,这是导致string效率底下的根本原因
2 .如果我们保存的字符在 ASCII 表的,比如[0-1, a-z,A-Z..]直接可以保存到 byte
3 .如果我们保存的字符对应码值大于 255,这时我们可以考虑使用 int 类型保存
string,byte,rune的区别
1.string:只读的采用utf8编码的字节切片,因此len获得的长度并不是字符个数,而是字节个数
2.rune是int32的别名,代表字符的unicode编码,采用4个字节存储。将string转为rune就意味着任何一个字符都采用4个字节来存储unicode值,这样每次遍历返回的时候就是返回unicode值,而不是字节,解决乱码的问题
1 .通过for range对字符串进行遍历时,每次获取到的对象都是rune类型的
2 .
3 .byte:字节切片,可变的
1 .使用string按增量方式构建字符串会导致多次内存分配和复制,但是使用bytes就不会,因此更加高效
3.utf8和unicode区别
1 .ascii:128个英文字符对应的二进制编码
2 .非ascii编码:其他语言:中文,法语,德语。需要用多个字节表示一个符号
3 .unicode:把所有的符号都纳入其中,每一个符号都给予独一无二的编码
4 .问题:Unicode有多种存储方式,对应很多的二进制格式,存储有很大的浪费,英文需要一个字节,汉字需要好几个字节,如果都是这样的话,那么会有很大的浪费
5 .utf8:utf8是unicode的实现方式之一,是一种变长的编码方式。根据不同的符号而变化字节长度
6 .
string,数组和切片的实现与区别
1 .这三种数据类型,在底层有相同的内存结构,在上层,因为语法的限制而有不同的行为表现
2 .数组
1 .数组是一种值类型,虽然数组的元素可以被修改,但是复制和函数传参都是整体复制的方式处理
2 .
3 .字符串
1 .字符串的底层也是对应的字节数组
2 .字符串的只读属性禁止了在程序种对底层字节数组的元素的修改
3 .字符串赋值只是服是了数据地址和对应的长度,并不会导致底层数据的复制
4 .切片
1 .切片的结构和字符串类似,只是解除了只读限制
2 .