初学Go并发(3)

2.7单向通道

有的时候需要将通道作为参数在多个任务函数间进行传递,因此很多时候在不同的任务函数中使用通道都会对其进行限制,比如限制通道在函数中只能发送或只能接收。

Go中才有单向通道来处理这种情况。例如采用如下例子进行:

package main

import "fmt"

// 这是一个写入通道
func counter(out chan<- int) {
	for i := 0; i < 100; i++ {
		out <- i
	}
	close(out)
}
func squarer(out chan<- int, in <-chan int) {
	for i := range in {
		out <- i * i
	}
	close(out)
}
func printer(in <-chan int) {
	for i := range in {
		fmt.Println(i)
	}
}

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	go counter(ch1)
	go squarer(ch2, ch1)
	printer(ch2)
}

其中:

  • chan<- int是一个只能发送的通道,可以发送但是不能接收;
  • <-chan int是一个只能接收的通道,可以接收但是不能发送。

在函数传参及任何赋值操作中将双向通道转换为单向通道是可以的,但反过来是不可以的。

2.8通道总结

channel常见的异常总结,如下:
初学Go并发(3)_第1张图片

因此就有如下总结注意事项

channel使用的注意事项
初学Go并发(3)_第2张图片

你可能感兴趣的:(go,学习)