【问题标题】:Capacity of slice doubles切片容量翻倍
【发布时间】:2021-11-25 13:43:00
【问题描述】:

我正在学习 golang,同时使用以下代码练习 slice:

package main

import "fmt"

func main() {

    var count int
    var subject string
    subjects := make([]string, 0)

    fmt.Print("Enter total number of subjects:")
    fmt.Scan(&count)

    for count != 0 {
        fmt.Print("\n\nEnter subject name: ")
        fmt.Scan(&subject)
        subjects = append(subjects, subject)
        fmt.Printf("\nlen=%d \ncap=%d \n%v\n", len(subjects), cap(subjects), subjects)
        count--
    }

}

结果如下,我得到:

输入学科名称:物理

len=4 cap=4 [印地语英语数学物理]

输入主题名称:地理

len=5 cap=8 [印地语英语数学物理地理]

为什么5号产能翻倍,如何按顺序增加产能

【问题讨论】:

  • “如何按顺序增加容量” -- 什么是“正确顺序”?上限根据增长算法的实现方式而增加,您可以在 Go 源码中查找它,它是开放的。

标签: go slice


【解决方案1】:

“正确顺序”在这种情况下不适用。 Go slice 由一个数组支持,当达到容量时,每次附加到它时都需要复制该数组。通过制作更大容量的数组,Go 试图最大限度地减少复制操作的数量,从而使append 函数的性能更高。

如果你事先知道一些元素,你可以用它来设置初始容量:

fmt.Print("Enter total number of subjects:")
fmt.Scan(&count)

subjects := make([]string, 0, count)

除非超出初始容量,否则 Go 不会增长底层数组。

【讨论】:

  • 谢谢。这清除了我的概念。我使用了subjects := make([]string, count, count),因为长度为零,容量为计数。所以在切片中添加新项目时它给了我运行时错误
猜你喜欢
  • 2023-03-18
  • 2016-08-09
  • 2013-12-25
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多