Slice
一个 slice
是一个数组某个局部的援用,在内存里,它是一个蕴含 3 个域的构造体:指向 slice 中第一个元素的指针,slice
的长度,以及 slice
的容量。
数组的 slice
并不会是理论复制一份数据,只是创立一个新的数据结构,蕴含另外的一个指针,一个长度和一个容量数据。
因为 slice
是不同于指针的多字长构造,宰割操作并不需要分配内存,
slice 的扩容
在对 slice
进行 append
等操作时,可能会造成 slice 的主动扩容。其扩容的大小增长规定是:
- 如果新的大小是以后大小的 2 倍以上,则大小增长为新大小
- 否则循环以下操作:如果以后大小小于 1024,俺每次 2 倍增长,否则每次按以后大小 1 / 4 增长。晓得增长的大小超过或等于新大小。
Go 有两个数据结构创立函数:new
和 make
。new
返回一个指向已清零内存的指针,而 make
返回一个简单的构造。
slice 与 unsafe.Pointer 互相转换
var o []byte
sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))
sliceHeader.Cap = length
sliceHeader.Len = length
sliceHeader.Data = uintptr(ptr)