我可以调整缓冲通道的大小吗?

and*_*ewz 2 concurrency channel go

我是 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.
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 7

通道创建后,其容量(缓冲区大小)将无法更改。您只能创建和分配不同容量的新频道。

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

var xxx chan int
Run Code Online (Sandbox Code Playgroud)

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

var xxx chan int = make(chan int, 10)
Run Code Online (Sandbox Code Playgroud)

或者干脆:

var xxx = make(chan int, 10)
Run Code Online (Sandbox Code Playgroud)

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

xxx = make(chan int, 20)
Run Code Online (Sandbox Code Playgroud)

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

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