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}