首页 > 解决方案 > 在运行时更新 golang 缓冲通道的容量

问题描述

我正在编写一段代码,其中缓冲通道的容量应该是一个可调参数。即在缓冲通道的第一次初始化之后,如果需要,我想更改通道的容量。

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    ch = make(chan int, 4)
    ch <- 3
    ch <- 4
    fmt.Println(<-ch)
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

以上失败并出现错误致命错误:所有 goroutines 都处于睡眠状态 - 死锁!打印 1,3 和 4 后。

以下代码适用于在更新其容量之前读取通道中的所有值的情况。

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    fmt.Println(<-ch)
    ch = make(chan int, 4)
    ch <- 3
    ch <- 4
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

有人可以在这里提供帮助,是否可以在运行时更新缓冲通道容量,同时它仍然具有一些尚未读取的值。

标签: gochannel

解决方案


有人可以在这里提供帮助,是否可以在运行时更新缓冲通道容量,同时它仍然具有一些尚未读取的值。

这是不可能的。一旦通过 make 构建通道,它就会保持其容量,这在运行时是不可改变的。


推荐阅读