Go语言中通道的len与cap差异解析

发表时间: 2024-05-10 10:29

在Go语言中, 通道(Channel)是一种用于在不同goroutines之间进行通信的数据结构。通道有两个重要的属性:长度(len)和容量(cap)。这两个属性用于不同的目的。

定义通道的格式:

make(chan T, capacity) // capacity

长度(len):

len(ch) 表示通道中当前存储的元素数量。

通道的长度是动态变化的, 它会随着元素的发送和接收操作而变化。

你可以使用 len 来检查通道是否为空, 如果长度为0, 通道为空; 如果长度大于0, 通道非空。

容量(cap):

cap(ch) 表示通道的容量, 即通道可以存储的元素的最大数量。

通道的容量在创建时就被确定, 不能动态改变。

通道的容量是在创建通道时通过 make 函数的第二个参数指定的, 例如:ch := make(chan int, 10) 表示通道 ch 的容量为10。

通道长度和容量的区别在于它们对通道的状态和可用性的描述:

长度描述了通道中当前存储的元素数量, 用于表示通道的实际使用情况。

容量描述了通道可以容纳的元素数量的上限, 用于限制通道的大小。

以下是一个示例, 演示如何使用长度和容量属性:

package mainimport "fmt"func main() {    ch := make(chan int, 3) // 创建一个容量为3的整数通道    fmt.Printf("长度(len):%d\n", len(ch)) // 输出0, 因为通道中有两个元素    fmt.Printf("容量(cap):%d\n", cap(ch)) // 输出3,通道的容量是3    ch <- 10    ch <- 11    fmt.Printf("长度(len):%d\n", len(ch)) // 输出2,因为通道中有两个元素    fmt.Printf("容量(cap):%d\n", cap(ch)) // 输出3,通道的容量是3    close(ch)    fmt.Printf("长度(len):%d\n", len(ch)) // 输出2,因为通道中还有两个元素可以读取    fmt.Printf("容量(cap):%d\n", cap(ch)) // 输出3,通道的容量是3}

如何定义缓冲区的大小?

package mainimport "fmt"func main() {    //make([]T, length, capacity) //length参数不能省略, capacity省略, 则和length的值相同    var s []int = make([]int, 0, 0) //创建    s = []int{1, 2, 3, 4, 5} //初始化    //make(chan T, capacity) // capacity省略    /*    ch := make(chan []int, len(s), cap(s)) // 使用内建函数cap()内建函数计算切片的容量    注意: make 定义通道时 make 只能有两个参数, 没有 length 这个参数    invalid operation: make(chan []int, len(s), cap(s)) expects 1 or 2 arguments; found 3    */    ch := make(chan []int, cap(s)) // 使用内建函数cap()内建函数计算切片的容量    fmt.Printf("长度(len):%d\n", len(ch))    fmt.Printf("容量(cap):%d\n", cap(ch))    ch <- s // 发送    res := <-ch // 接收    fmt.Println(res) // 输出接收到的数据: [1 2 3 4 5]    fmt.Printf("长度(len):%d\n", len(res)) // 输出5    fmt.Printf("容量(cap):%d\n", cap(res)) // 输出5}