【协作式原创】查漏补缺之Go的slice基础和几个难点
Q: 为啥要字节对齐的
https://www.nowcoder.com/discuss/57978
TODO:
Q: go反汇编指令
go tool compile -S plan9Test.go | grep plan9Test.go:6
Q: a[0]:(int32,0,5)(int32,3,5) 3可以append,0不可以append.
Q: 如何证明slice底层函数被修改了
A: 打印slice的第一个元素地址即可,第一个元素地址就是数组地址。
A: 也可以用反射获取slce的运行时结构SliceHeader,可以看到具体的data,len,cap字段值
Q: slice和slice的指针的区别. new返回的是指向slice的指针,不能当成slice使用,必须解指针后成为slice后,才方便使用.
a=*new(int[],0,5) new返回unsafe.Pointer,需要解地址才是切片
Q: TODO 内存对齐,字节对齐: why,how.
Q: 值传递时,值传递到底传递的是啥,如何传递的副本。a变量是地址的别名,传递变量的内存地址值,内存地址值拷贝一个副本。
TODO:
a[1:4] a[8:] 修改还是没修改的原理
growslice函数有多个分支
- 入参 cap的计算
- else 分支 newcap += newcap /4
- 最开始的分支的坑, 为什么是cap扩容为6而不是8。