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

0x25w · 2022-01-20 11:04:35 · 786 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2022-01-20 11:04:35 的文章,其中的信息可能已经有所发展或是发生改变。

总结:

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%

代码示例

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群:692541889

786 次点击  
加入收藏 微博
1 回复  |  直到 2022-01-21 09:25:23
feiyang
feiyang · #1 · 3年之前

https://golang.design/go-questions/slice/grow/

进行内存对齐之后,新 slice 的容量是要 大于等于 老 slice 容量的 2倍或者1.25倍。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传