go slice 切片
https://juejin.cn/post/6979108608122290212
结构体
| type slice struct { |
| array unsafe.Pointer |
| len int |
| cap int |
| } |
定义的三种方式
1、var 切片名 []type
2、使用make()函数定义,make([]type,len)
| var s []int = make([]int,1) |
3、指定容量make([]type, len, cap),len初始化长度,cap为可变参数
| var s []int = make([]int,3,4) |
| |
容量
容量的用途是append扩容时,如果新的长度小于容量,不会更换底层数组,内存地址不变;否则,go会重新申请一个底层数组,拷贝这边的值过去,把原来的数组丢掉,内存地址改变(已经是一个新的数组)。
扩容
| func growslice(et *_type, old slice, cap int) slice { |
| ........... |
| newcap := old.cap |
| doublecap := newcap + newcap |
| if cap > doublecap { |
| newcap = cap |
| } else { |
| if old.len < 1024 { |
| newcap = doublecap |
| } else { |
| |
| |
| for 0 < newcap && newcap < cap { |
| newcap += newcap / 4 |
| } |
| |
| |
| if newcap <= 0 { |
| newcap = cap |
| } |
| } |
| } |
| ........... |
| } |
- 如果预估新的容量大于容量的2倍,直接使用新容量;
- 不满足情况1,老的容量小于1024,则新的容量直接等于就容量的2倍;
- 不满足情况2,就容量大于等于1024,则旧容量小于需要的容量,则就容量不停的*1.25,直到大于新容量。
| |
| func TestSlice(t *testing.T) { |
| s := make([]int,1024,1024) |
| |
| fmt.Println(cap(s)) |
| s = append(s,1) |
| |
| fmt.Println(cap(s)) |
| add := make([]int,255) |
| s = append(s,add...) |
| |
| fmt.Println(cap(s)) |
| |
| s = append(s,1) |
| fmt.Println(cap(s)) |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架