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 []bytesliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))sliceHeader.Cap = lengthsliceHeader.Len = lengthsliceHeader.Data = uintptr(ptr)