返回介绍

03.3.2 切片的扩容

发布于 2024-08-14 12:50:32 字数 4680 浏览 0 评论 0 收藏 0

切片有两个主要的属性:容量长度,而且这两个属性的值往往是不一样的。一个与数组拥有相同数量元素的切片,二者的长度是相同的,且均可以通过函数len()获得。切片的容量是指切片能够容纳的元素空间,可以通过cap()函数获得。由于切片的大小是动态变化的,如果一个切片超出了其设置的容量,Go会自动将该切片的长度变为原来的两倍,以存放超出的元素。

简单来说,当切片的容量和长度相等时,你再往该切片追加元素,切片的容量就会变为原来的两倍,当然长度增加1。然而这种操作可能对于小的切片效果比较好,对于大型切片来说会占用的内存会超出你预期。

下面的代码lenCap.go分三部分,清楚地阐述了切片的容量与长度的变化规律,第一部分代码:

> package main
>
> func printSlice(x []int)  {
>    for _, number := range x {
>       fmt.Println(number," ")
>    }
>    fmt.Println()
> }

printSlice()打印一个slice的所有元素。

第二部分代码:

> func main()  {
>    aSlice := []int{-1, 0, 4}
>    fmt.Printf("aSlice: ")
>    printSlice(aSlice)
> 
>    fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))
>    aSlice = append(aSlice, -100)
>    fmt.Printf("aSlice: ")
>    printSlice(aSlice)
>    fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))

这部分代码中,我们往aSlice中添加元素以出发其长度和容量的变化。

第三部分代码:

> aSlice = append(aSlice, -2)
>    aSlice = append(aSlice, -3)
>    aSlice = append(aSlice, -4)
>    printSlice(aSlice)
>    fmt.Printf("Cap: %d, Length: %d\n",cap(aSlice),len(aSlice))
> }

以上代码的执行结果是:

> $ go run lenCap.go
>
> aSlice: -1  
> 0  
> 4  
>
> Cap: 3, Length: 3
> aSlice: -1  
> 0  
> 4  
> -100  
>
> Cap: 6, Length: 4
> -1  
> 0  
> 4  
> -100  
> -2  
> -3  
> -4  
>
> Cap: 12, Length: 7

正如输出所示,初始的切片长度和容量均是3,在添加一个元素之后,其长度变为4,然后容量变为6。继续往切片中追加元素,其长度变为7,容量再一次翻倍即变为12。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文