Golang中capacity的定义在哪里可以找到?

Golang中capacity的定义在哪里可以找到? 在哪里可以找到关于容量的明确定义?

18 回复

是的!

更多关于Golang中capacity的定义在哪里可以找到?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不客气 😉

这确实很有帮助

好主意。动态的?

是的。这是正确的!

这非常清晰且有用,我会保存它。

那么长度是由我在切片中创建的元素数量决定的吗?容量是计算机为我已创建内容分配的空间吗?

是的,切片的容量是动态的,当长度超过容量时会自动翻倍。

太棒了!谢谢!能够达成理解真是令人兴奋!💡

我重新看了你的解释,现在理解得更清楚了一些。我尝试将黄色标记部分复制粘贴到Go Playground,得到了以下结果。

https://play.golang.org/p/Zjd47JkfGhG

我哪里做错了?

动态的 /dīˈnamik/ 形容词

(指过程或系统)以持续变化、活动或进展为特征的。

切片的容量是动态的,当长度超过容量时会自动翻倍

明白了!很酷!谢谢!

https://play.golang.org/p/oLVnZ3tGYpT

你将程序粘贴在了中间位置,导致出现了两个main函数和一些额外内容。我仅对此进行了修改,现在它可以正常工作了。

将切片想象成一个书架。长度是当前存放的书籍数量,容量是剩余的空间。例如当容量超出时(比如你试图放入超过书架容量的书籍,通过追加操作),系统会购买一个两倍大的新书架,并将所有书籍转移到新书架上。每本书代表切片中的一个元素,从0开始依次编号。这样理解是否合理?

func main() {
    fmt.Println("hello world")
}

让我们从一个简单的日常生活例子开始
想象一个能装1000毫升牛奶的瓶子,现在瓶子里有700毫升牛奶
牛奶的总存储量就是容量(capacity),即1000毫升;而当前瓶中的牛奶量就是长度(length),即700毫升。
现在切换回我们的例子
我们有一个整数切片,长度为700,容量为1000

a:=make([]int, 700,1000)

请记住一点:这个切片是动态的

哈哈,这不是我要找的定义。

是的,我在关于切片的讨论中遇到过这个问题。
从你们的讨论中,我觉得我对容量有了些感觉,但还不够具体。我理解长度的概念。
“切片的容量是在底层数组中已分配空间可容纳的元素数量”——这个说法很接近了。我得再研究下数组。
数组是单一类型元素的编号序列
这很有帮助。

我觉得很多问题都需要熟悉这门语言,而我的理解已经开始逐步加深了。

如果使用切片字面量,长度和容量会是相同的。但如果使用 make,容量和长度可以不同。

有几个因素决定了长度。

这里的长度是多少?

s := make([]byte, 0, 100)

// 长度是0,但容量是100。

现在呢?

s = s[:5]

// 现在长度是5,但容量仍然是100。

现在呢?

s = append(s[:100], 42)

// 现在长度是101,但容量是208。
// 因为空间不足,所以分配了新的底层数组。

总结:

  • 容量是底层数组的长度(从切片起始位置开始计算)。
  • 记住,切片只是底层数组的一个视图。
  • 其长度由它指向的底层数组的片段决定。
  • 是的:“计算机为底层数组分配的容量空间”

嗨 Cherolyn,

也许这里?https://en.wiktionary.org/wiki/capacity 😄

你在哪里遇到这个术语的?我猜是在学习切片的时候。

切片由三部分组成:

  1. 指向数组元素的指针(暂时不用担心这个) 以及两个数字:
  2. 切片的长度(其中包含多少个元素)
  3. 切片的容量。这是它能容纳多少个元素。当它满了的时候,切片需要添加更多空间才能容纳更多元素。(实际上,需要重新分配的是切片指向的那个数组。)

你可以使用 Go 的内置 len()cap() 函数来访问切片的长度和容量。在下面的例子中,请注意在我使用 append() 向切片添加内容后,容量是如何增长的,它总是保持大于或等于长度。

package main

import "fmt"

func main() {
    var int_slice []int     // 一个整数切片

    // 向切片添加 3 个整数
    int_slice = append(int_slice,32)
    int_slice = append(int_slice,67)
    int_slice = append(int_slice,99)

    fmt.Println(int_slice)
    fmt.Printf("Length: %d\n",len(int_slice))
    fmt.Printf("Capacity: %d\n",cap(int_slice))

    // 再添加 2 个整数
    int_slice = append(int_slice,22)
    int_slice = append(int_slice,11)
    
    fmt.Println(int_slice)
    fmt.Printf("Length: %d\n",len(int_slice))
    fmt.Printf("Capacity: %d\n",cap(int_slice))
}

https://play.golang.org/p/asm1a_MgKv-

len()cap() 函数也可以应用于其他东西。参见 https://golang.org/ref/spec#Length_and_capacity

如果这没有回答你的问题,请提出更具体的问题。

在Go语言中,容量的概念主要与切片(slice)和通道(channel)相关。容量的明确定义可以在Go语言官方文档中找到,具体位于语言规范(Language Specification)部分。

  1. 切片(slice)的容量
    容量指的是切片底层数组的长度,即从切片的起始索引到底层数组末尾的元素个数。可以通过内置函数cap()获取。
    示例:

    package main
    import "fmt"
    
    func main() {
        arr := [5]int{1, 2, 3, 4, 5} // 底层数组
        slice := arr[1:3]           // 切片从索引1到3(不包含3)
        fmt.Printf("长度: %d, 容量: %d\n", len(slice), cap(slice)) // 输出:长度: 2, 容量: 4
    }
    

    这里,切片slice的容量为4,因为底层数组从索引1开始,剩余空间为4个元素(索引1到4)。

  2. 通道(channel)的容量
    容量指的是通道缓冲区的大小,即通道可以存储的元素数量。对于无缓冲通道,容量为0。通过cap()函数获取。
    示例:

    package main
    import "fmt"
    
    func main() {
        ch := make(chan int, 3) // 创建容量为3的缓冲通道
        fmt.Printf("通道容量: %d\n", cap(ch)) // 输出:通道容量: 3
    }
    

详细定义可参考Go官方文档:

这些资源提供了容量的正式说明和用法。

回到顶部