go语言channel关注点

htyu_0203_39 · · 927 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:htyu_0203_39

查看原文:go语言channel关注点

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

927 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传