单向channel

2025-07-09T19:08:19

channel如果直接定义一般都是双向的,即我们既可以往里面写值,也可以从里面读值。

但是有的时候我们希望某一个方法里面只能是读值,不能写值、或者是只能够写值,不能够读值,此时就需要用到单项channel。

单向channel的定义和双向channel差不多,只是多了一个 <- 来标识是单向写入还是单向取出

var ch1 chan<- int // 写入
var ch2 <-chan int // 取出

对于初始化可以通过将一个双向channel赋值给单向channel来完成初始化,go会在内部自动完成类型的转换。

var ch1 chan<- int // 写入
var ch2 <-chan int // 取出

ch := make(chan int, 1)
ch1 = ch
ch2 = ch

例如:

var wg sync.WaitGroup
func producer(out chan<- int) {
    defer wg.Done()
    for i:= 0; i < 10; i ++ {
        out <- i
    }
    close(out)
}

func receiver(in <-chan int) {
    defer wg.Done()
    for num := range in {
        fmt.Println(num)
    }
}

func main() {
    wg.Add(2)
    c := make(chan int)
    go producer(c)
    go receiver(c)
    wg.Wait()
}

运行结果如下:

0
1
2
3
4
5
6
7
8
9
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »