Slice

一个slice是一个数组某个局部的援用,在内存里,它是一个蕴含3个域的构造体:指向slice中第一个元素的指针,slice的长度,以及slice的容量。

数组的slice并不会是理论复制一份数据,只是创立一个新的数据结构,蕴含另外的一个指针,一个长度和一个容量数据。

因为slice是不同于指针的多字长构造,宰割操作并不需要分配内存,

slice的扩容

在对slice进行append等操作时,可能会造成slice的主动扩容。其扩容的大小增长规定是:

  • 如果新的大小是以后大小的2倍以上,则大小增长为新大小
  • 否则循环以下操作:如果以后大小小于1024,俺每次2倍增长,否则每次按以后大小1/4增长。晓得增长的大小超过或等于新大小。

Go有两个数据结构创立函数:newmakenew返回一个指向已清零内存的指针,而make返回一个简单的构造。

slice与unsafe.Pointer互相转换

var o []bytesliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))sliceHeader.Cap = lengthsliceHeader.Len = lengthsliceHeader.Data = uintptr(ptr)