【协作式原创】查漏补缺之Go的slice基础和几个难点 a[1:4] a[8:] 修改还是没修改的原理 growslice函数有多个分支

【转载】队友博客

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:

growslice函数有多个分支

  1. 入参 cap的计算
  2. else 分支 newcap += newcap /4
  3. 最开始的分支的坑, 为什么是cap扩容为6而不是8。