关于golang:深入解析Go

49次阅读

共计 533 个字符,预计需要花费 2 分钟才能阅读完成。

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)

正文完
 0