关于golang:深入解析Go

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理