Go笔记-Chap5 数据

2019-05-09  本文已影响0人  leon4ever

5.1 字符串

不可变字节序列,本身是个复合结构

type stringStruct struct{
    str unsafe.Pointer
    len int
}

转换

修改字符串必须将其转换为可变类型[ ]rune或[ ]byte,完成后再转换回来。重新分配内存并复制数据
考虑到只读特性,转换时复制并新分配内存是可以理解的。但是编译器也会专门优化:

性能

加法拼接,每次重新分配内存,性能较差
改进方法:

Unicode

类型rune专门存储Unicode,是int32的别名,单引号标识

5.2 数组

指针

获取数组变量的地址,可获取任意元素地址,可直接操作元素

复制

Go数组也是值类型,赋值和传参都会复制整个数组数据。
避免的方法是:指针或切片

切片

通过指针引用底层数组,将读写操作限定指定区域。

x[low, high, max]
len = high - low
cap = max - low

注:数组必须addressable,否则会错误

func main() {
    s := []int{0, 1, 2, 3, 4}
    p := &s
    p0 := &s[0]
    p1 := &s[1]
    println(p, p0, p1)
    (*p)[0] += 100
    //*p += 100   错误!
    *p0 += 100
    *p1 += 100
    fmt.Println(s)
}

reslice

将切片视作[cap]slice数据源,据此创建新切片对象,不能超出cap
新建切片依旧指向原底层数组,修改对所有关联切片可见

append

向切片尾部添加数据,返回新的切片对象
数据被追加至原底层数组,如超出限制,则为新切片对象重新分配数据,(旧切片对象还用旧的数组)

copy

在两个切片间复制对象,允许指向同一底层数组,允许目标区重叠,最终所复制的长度以较短切片的长度为准。

5.4 字典

安全

性能

5.5 结构

struct将多个不同类型命名字段field序列打包成一个复合类型。

空结构

长度为零,底层指向runtime.zerobase变量
可用作通道元素类型,用于事件通知

匿名字段

没有名字,仅有类型,称作嵌入字段
从编译器角度,隐式的以类型名作为字段名字

字段标签

不是注释!是对字段进行描述的元数据,运行期可用反射获取标签信息

内存布局

不管结构体包含多少字段,其内存总是一次性分配的,按定义顺序排列
对齐处理,以所有字段中最长的基础类型宽度为标准
空类型也会当做长度为1进行对其处理,使其地址不越界

上一篇下一篇

猜你喜欢

热点阅读