go channel

channel

创建channel

可以通过make函数来创建channel,channel是引用类型,空值为nil

ch := make(chan int)

close channel

使用close函数关闭channel之后,后续的发送调用都会panic,后续的接收调用都会收到空值,可以用下面的语法判断channel是否被关闭。

value, ok := <- ch

使用for range语法可以自动判断channel是否已经关闭

func main() {
	naturals := make(chan int)
	squares := make(chan int)
	// Counter
	go func() {
		for x := 0; x < 100; x++ {
			naturals <- x
		}
		close(naturals)
	}()
	// Squarer
	go func() {
		for x := range naturals {
			squares <- x * x
		}
		close(squares)
	}()
	// Printer (in main goroutine)
	for x := range squares {
		fmt.Println(x)
	}
}

close一个已经close的channel,或者nil channel时,都会引起panic

channel复用

go中提供select语法,可以对channel进行复用。

func main() {
	ch := make(chan int, 1)
	for {
		select {
		case ch <- 0:
		case ch <- 1:
		}
		i := <-ch
		fmt.Println(i)
	}
}

select随机选择一个就绪的可读或者可写的channel执行,如果都没有就绪就会陷入等待,上面的代码会随机输出0和1的序列。

posted @ 2020-12-10 21:34  HachikoT  阅读(80)  评论(0编辑  收藏  举报