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