Go语言中 cap 函数可以作用于哪些内容?

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 问答

Go语言中 cap 函数可以作用于哪些内容?

Go语言中 cap 函数可以作用于的类型有: l array(数组) l slice(切片) l channel(通道)

1 回复

在Go语言中,cap 函数用于获取一个容器(如切片、映射、通道等)的容量。然而,需要注意的是,cap 函数主要被设计用于获取**切片(slice)通道(channel)**的容量,因为这两种类型在Go中有明确的容量概念。对于其他类型,如映射(map)或数组(array),cap 函数并不适用或其行为不符合预期。

切片(Slice)

对于切片,cap 函数返回切片底层数组的长度,即切片可以增长到的最大长度,而不需要重新分配内存。

示例代码

package main

import "fmt"

func main() {
    s := make([]int, 0, 5) // 创建一个长度为0,容量为5的切片
    fmt.Println(cap(s)) // 输出: 5

    s = append(s, 1, 2, 3, 4, 5) // 添加元素,但不超过容量
    fmt.Println(cap(s)) // 输出: 5

    s = append(s, 6) // 添加第6个元素,超出原容量,切片可能会重新分配内存
    fmt.Println(cap(s)) // 输出可能大于5,具体取决于运行时
}

通道(Channel)

对于通道,cap 函数返回通道中缓冲区的容量。无缓冲的通道容量为0,而有缓冲的通道容量则是创建时指定的。

示例代码

package main

import "fmt"

func main() {
    ch1 := make(chan int) // 无缓冲通道
    fmt.Println(cap(ch1)) // 输出: 0

    ch2 := make(chan int, 5) // 有缓冲通道,容量为5
    fmt.Println(cap(ch2)) // 输出: 5
}

注意事项

  • 对于数组(array),因为数组的长度在声明时就已确定且不可更改,所以Go语言中没有提供直接获取数组“容量”的函数。数组的长度可以通过len函数获取,但cap函数对数组调用时,其返回值与len相同,因为数组的长度和容量在Go中总是相等的。
  • **映射(map)**没有容量的概念,因为映射的大小可以动态增长和缩小,所以cap函数不适用于映射。

总结,cap函数主要用于获取切片和通道的容量。

回到顶部