本文摘自php中文网,作者藏色散人,侵删。
下面由go语言教程栏目给大家介绍Golang 切片(Slice)底层源码,希望对需要的朋友有所帮助!
数组
说切片前先说下数组。数组的两个特性
- 一段连续内存地址,每个元素都是连续的
- 元素的类型相同,并且元素个数固定
Go 数组是值类型,赋值和函数传参操作都会复制整个数组数据。
1 2 3 |
|
切片
切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型.切片是一个长度可变的数组。
Slice 的数据结构定义如下:
runtime/slice.go#L13
1 2 3 |
|
- array 就是底层数组的地址
- len 切片的长度
- cap 切片的容量
创建切片
src/runtime/slice.go#L83
1 2 3 4 |
|
基本逻辑就是根据容量申请一块内存。
切片扩容
扩容是当切片的长度大于容量的时候,底层数组已经装不下时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
- 新申请容量cap,如果大于2倍旧容量(oldcap),要扩容的容量(newcap)=新申请容量cap
- 如果旧容量(oldcap)< 1024, 要扩容的容量(newcap)在旧容量(oldcap)基础上扩容1倍,否则则扩容 1/4
- 如果数值溢出,要扩容的容量 = 新申请的容量
1 2 3 4 5 6 |
|
- 注意事项: 切片共享底层数组,所以在切片赋值的时候,修改切片会导致底层数组改变,而产生BUG
1 2 3 4 5 6 7 8 9 |
|
切片复制
src/runtime/slice.go#L247
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
以上就是阅读Golang 切片(Slice)底层源码的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
go语言sync包的学习(mutex、waitgroup、cond)
24 goroutine channel实现并发和并行(一)
更多相关阅读请进入《golang》频道 >>

Go语言101
一个与时俱进的Go编程知识库。