关于对切片操作导致基底数组变更的问题

0x25w · · 217 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## 总结: **s := []int{1, 2, 3, 4, 5}** 长度**5** 容量**5** **newS := s[a:b]** 以**s**为基底生成切片时, 长度 **b-a** 容量 **len(s)-a** 当**newS**进行**append**后: 若容量不超 ,那么**[]s**也会跟着改变 若超了,则**[]s**不改变,**[]newS**可视为**new**出来的一个切片 且容量翻倍直至足够容纳新切片,当超过**1000**时,变为每次增长**25%** ## 代码示例 ```go package main import "fmt" func main() { } // 切片基底数组变更 func slice1(){ //new一个长度5容量5的数组 slice := []int{10, 20, 30, 40, 50} //切片生成新数组,这个数组的长度为3-1=2 容量为len(slice)-1 此处的1是切片开始的位置 newSlice := slice[1:3] //进行append操作,append一次后长度变为3 newSlice = append(newSlice, 60) //由于未超出容量4,因此会导致基底跟随变化 fmt.Printf("slice: %v\n", slice) fmt.Printf("newSlice: %v\n", newSlice) // output: // slice: [10 20 30 60 50] // newSlice: [20 30 60] } // 切片基底数组未变更 func slice2(){ //new一个长度5容量5的数组 slice := []int{10, 20, 30, 40, 50} //切片生成新数组,这个数组的长度为3-1=2 容量为len(slice)-1 此处的1是切片开始的位置 newSlice := slice[1:3] //进行append操作,append一次后长度变为5,但是之前容量只有4,因此容量翻倍变为8 newSlice = append(newSlice, 60,70,80) //由于超出容量4,因此新切片可被视为new出来的,不会导致基底跟随变化 fmt.Printf("slice: %v\n", slice) fmt.Printf("newSlice: %v\n", newSlice) // output: // slice: [10 20 30 40 50] // newSlice: [20 30 60 70 80] } ```

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

217 次点击  
加入收藏 微博
1 回复  |  直到 2022-01-21 09:25:23
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传