package main import ( "fmt" ) func main() { //case 1: 对一个nil channel 进行写将发生阻塞. //var c chan int //go语言自动对未初始化的变量赋其类型对应的零值,如: nil, 0, ""等. //c <- 1 //case 2: 对一个nil channel 进行读将发生阻塞. //<- c //case 3: 对一个已经关闭的unbuffered channel进行写操作,将发生panic异常. //c1 := make(chan int) //close(c1) //c1 <- 1 //case 4: 对一个已经关闭的unbuffered channel进行读操作,返回channel元素类型的零值,如:false,o,nil等 //x := <- c1 //fmt.Println(x) //case 5: 对一个已经关闭的buffered channel进行读操作,见以下代码注释. c2 := make(chan int, 3) c2 <- 1 c2 <- 2 c2 <- 3 close(c2) //尽管channel 已经关闭了, 但是我们依然可以从中读出关闭前写入的3个值,自第4次开始读取时,则返回该channel元素类型对应的零值: 0, //即使仍继续不断读取,仍然是零值. fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) fmt.Printf("%d\n", <- c2) //case 6: 对一个已经关闭的buffered channel进行写操作,将发生panic异常. c2 <- 4 //大原则: 1. 最好由生产者或称写入者负责关闭channel,这样可以有效避免发生panic异常. //2. 不带缓冲的channel本身具有通信同步两个特点,channel是线程安全的,协成安全的,可多个goroutine共享使用不必加锁保护它. }
参考: http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/
简单整理细化一下,写代码测试了一下,怕忘了写下笔记,感谢参考文章作者,读其文章令我受益匪浅,在此表达感谢。
注意: 此文章只是我个人笔记, 如有错漏,请一定指正, 共同学习, 我的邮箱: htyu_0203_39@sina.com
有疑问加站长微信联系(非本文作者)