美文网首页
Go语言——Slice分析

Go语言——Slice分析

作者: 陈先生_9e91 | 来源:发表于2018-10-20 18:23 被阅读0次

Go语言——Slice分析

源码很不好找,在go\src\runtime\slice.go。

type slice struct {
   array unsafe.Pointer
   len   int
   cap   int
}
func makeslice(et *_type, len, cap int) slice {
   p := mallocgc(et.size*uintptr(cap), et, true)
   return slice{p, len, cap}
}

根据容量cap*元素size,申请一块内存。mallocgc大空间(大于32kb)才会在heap堆上申请,否则在栈上分配,具体以后再介绍。

这里我们就看到切片底层就是数组,特别的是切片可以增长。

grow

注释

// it returns a new slice with at least that capacity, with the old data
// copied into it.
// The new slice's length is set to the old slice's length,
// NOT to the new requested capacity.
// This is for codegen convenience. The old slice's length is used immediately
// to calculate where to write new values during an append.

Note:

  1. 方法返回的新切片容量至少达到请求,也就是说新的容量可能比申请的多;
  2. copy老数据,也就是说有性能损耗;
  3. len一致,因为数据内容不变.

cap

   newcap := old.cap
   doublecap := newcap + newcap
   if cap > doublecap {
      newcap = cap
   } else {
      if old.len < 1024 {
         newcap = doublecap
      } else {
         for newcap < cap {
            newcap += newcap / 4
         }
      }
   }

cap增长策略:

  1. 如果期望大于double,新cap就等于期望;
  2. 如果当前大小小于1024,则两倍增长;
  3. 否则每次增长25%,直到满足期望。

相关文章

  • Go语言——Slice分析

    Go语言——Slice分析 源码很不好找,在go\src\runtime\slice.go。 根据容量cap*元素...

  • Go slice扩容深度分析(来自掘金文章)

    Go slice扩容深度分析 本文主要是对go slice的扩容机制进行了一些分析。环境,64位centos的do...

  • Go-数组与slice

    本文将讲解Go语言中的数组与slice。之前看到网上好多 《深入理解slice》、《深入解析slice》... 的...

  • 七、Go切片

    七、Go语言切片(Slice) Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就...

  • go语言slice数据类型的定义和使用

    这篇文章介绍go语言slice数据类型的定义,内部格式,以及如何声明和定义slice类型变量。 slice数据类型...

  • Go语言切片(Slice)

    Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,...

  • Go slice那些事

    今晚闲来无事,总结一下Go的slice slice是什么slice在Go中的原型?slice类似数组,是一种定长的...

  • Golang Range关键字的秘密

    Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下: 数组(array) 切片(slice) ...

  • golang数据类型

    Go语言中有四种复合数据类型:数组,slice,map,结构体 数组和结构体都是聚合类型,长度固定。而slice和...

  • Go语言之切片(Slice)

    一:初识 定义切片var 切片名 [] type切片不需要说明长度,或使用make()函数来创建切片 make...

网友评论

      本文标题:Go语言——Slice分析

      本文链接:https://www.haomeiwen.com/subject/ehvmzftx.html