go语言channel关注点


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值