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.
解决方案
一旦创建了通道,就无法更改其容量(缓冲区大小)。您只能创建和分配具有不同容量的新通道。
请注意,仅声明通道类型的变量不会创建和初始化通道,它将是通道类型的零值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 将不知道新通道并将继续使用旧的传递通道。
推荐阅读
- javascript - 如何在从 Google 电子表格获取边框值时避免多次尝试捕获未定义的值(通过使用 if/else 或其他方式)?
- excel - Excel - 指定范围内两个日期之间的差异
- javascript - Javascript链接列表合并返回未定义
- dart - 如何向扩展 DataTableSource 的类提供数据
- python - 如何在每个标签中仅获取 xpath 中的一个元素?
- r - 计算每个值在行数据框 r 中出现的次数
- ruby-on-rails - 使用包含时按联接表中的字段过滤
- postgresql - 尝试在 postgres 中插入 json 时面临“格式错误的数组文字”
- .htaccess - 301 从 .htm 重定向到 /
- database - 当 DB(MySQL,MongoDB)的多个 docker 实例使用来自同一个 DB 的同一个表时,如何处理数据库?