首页 > 解决方案 > 我可以调整缓冲通道的大小吗?

问题描述

我是 Golang 的新手,我可以调整缓冲通道的大小,例如:

var xxx // just declaration.

...

xxx = make(chan string, mysize)   // I know `xxx := make(chan string, mysize)` work, but I don't want it.

...

xxx <- "123" // using the buffered channel.

标签: goconcurrencychannel

解决方案


一旦创建了通道,就无法更改其容量(缓冲区大小)。您只能创建和分配具有不同容量的新通道。

请注意,仅声明通道类型的变量不会创建和初始化通道,它将是通道类型的零值nil

var xxx chan int

xxx是一个 的变量chan int,但它尚未初始化,您不能在其上发送任何值。您必须使用内置make()函数创建一个,例如:

var xxx chan int = make(chan int, 10)

或者简单地说:

var xxx = make(chan int, 10)

它的容量将是10并且不能改变。但是,您可以为其分配一个新的通道值,例如:

xxx = make(chan int, 20)

但是要知道,如果多个 goroutine 访问和使用该xxx变量,上述操作可能会导致数据竞争,并且更改 value 的值xxx应该与读取它的其他 goroutine 同步。

另请注意,如果 goroutine 不访问xxx但通道被“传递”给它们,那么分配一个新的通道值xxx不会影响它们,这些 goroutine 将不知道新通道并将继续使用旧的传递通道。


推荐阅读