【问题标题】:May I resize the buffered channel's size?我可以调整缓冲通道的大小吗?
【发布时间】:2020-09-30 20:52:21
【问题描述】:

我是 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.

【问题讨论】:

    标签: go concurrency channel


    【解决方案1】:

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

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

    var xxx chan int
    

    这里xxxchan int的一个变量,但它还没有初始化,你不能在上面发送任何值。您必须使用内置的make() 函数创建一个,例如:

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

    或者简单地说:

    var xxx = make(chan int, 10)
    

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

    xxx = make(chan int, 20)
    

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      相关资源
      最近更新 更多