利志分享
fast_forward
view_headline
go教程
clickhouse教程
python教程
shell教程
原创杂文
打赏
go教程
clickhouse教程
python教程
shell教程
原创杂文
打赏
go基础知识
go的环境搭建
go变量
go常量
go字符串
go数组和切片
go的map和range的使用
go的struct的使用
go的函数使用
go的interface的使用
go channel使用
go的routine使用
go的panic和recover使用
go实现http请求
go 复杂的http请求
go实现表单提交
go实现表单验证
go上传附件
go实现mysql连接
go实现redis操作
go对xml操作
go的json操作
go的base64使用
go实现websocket功能
go的单元测试
go的文件操作
go的web服务基础
golang url解析和包介绍使用
go的正则表达式-MatchString,FindString等的使用
go进阶
go的类型转换
go的map的多维应用
go的多维数组和slice使用
go的select使用
go的原子性atomic类库使用
go给图片添加水印
go给图片添加文字
go实现http的rpc服务
go实现tcp的rpc服务
go实现json格式的rpc服务
多个defer的执行问题
golang的队列机制实现同步主线程接受子协程的结果
go的值传递和引用传递以及引用类型的问题
go中的make和new的使用问题
golang读文件分析1
golang读文件分析2
golang实现自然周计算
golang实现读写excel
go实战
beego的安装和使用
beego聊天室的基本配置
beego聊天室的生成
Go 写一个类似 cron 的定时任务管理器
Go 调度器 M, P 和 G
go实战总结
go的日期操作类使用-日常使用类库no.1
go的字符串的连接讲解-日常实战总结no.1
golang实现队列服务-日常实战总结no.2
深入理解golang的channel的使用-日常实战总结no.3
go的sync.pool在实际应用中的讲解和性能分析比较-日常实战总结no.4
go语言中一个典型的引用类型的数据使用案例的注意点-日常实战总结no.5
go的sync包的使用详解1-日常实战总结6
go的sync包的使用详解2-日常实战总结7
深度学习go判断各个类型相等-日常实战总结8
go的排序类使用讲解-日常实战总结9
go的context使用讲解
golang 网络爬虫框架gocolly
golang实现桶排序
golang处理gb2312转utf-8编码的问题
golang实现单链的添加,删除以及翻转
go深入
由引用类型引发的概念的深入理解
sync.WaitGroup深入源码理解
golang如何创建动态的struct类型以及如何转换成slice类型
深入理解go的管道数据读写
关于go的只读管道只写管道以及单向管道的理解
深入理解go的slice深入,slice扩容机制
深入理解go的函数参数传递
golang实现动态调用不同struct中不同的方法
如何配置sqlx.DB的SetMaxOpenConns SetMaxIdleConns 和 SetConnMaxLifetime来保证更好的性能
目录
go基础知识
go的环境搭建
go变量
go常量
go字符串
go数组和切片
go的map和range的使用
go的struct的使用
go的函数使用
go的interface的使用
go channel使用
go的routine使用
go的panic和recover使用
go实现http请求
go 复杂的http请求
go实现表单提交
go实现表单验证
go上传附件
go实现mysql连接
go实现redis操作
go对xml操作
go的json操作
go的base64使用
go实现websocket功能
go的单元测试
go的文件操作
go的web服务基础
golang url解析和包介绍使用
go的正则表达式-MatchString,FindString等的使用
go进阶
go的类型转换
go的map的多维应用
go的多维数组和slice使用
go的select使用
go的原子性atomic类库使用
go给图片添加水印
go给图片添加文字
go实现http的rpc服务
go实现tcp的rpc服务
go实现json格式的rpc服务
多个defer的执行问题
golang的队列机制实现同步主线程接受子协程的结果
go的值传递和引用传递以及引用类型的问题
go中的make和new的使用问题
golang读文件分析1
golang读文件分析2
golang实现自然周计算
golang实现读写excel
go实战
beego的安装和使用
beego聊天室的基本配置
beego聊天室的生成
Go 写一个类似 cron 的定时任务管理器
Go 调度器 M, P 和 G
go实战总结
go的日期操作类使用-日常使用类库no.1
go的字符串的连接讲解-日常实战总结no.1
golang实现队列服务-日常实战总结no.2
深入理解golang的channel的使用-日常实战总结no.3
go的sync.pool在实际应用中的讲解和性能分析比较-日常实战总结no.4
go语言中一个典型的引用类型的数据使用案例的注意点-日常实战总结no.5
go的sync包的使用详解1-日常实战总结6
go的sync包的使用详解2-日常实战总结7
深度学习go判断各个类型相等-日常实战总结8
go的排序类使用讲解-日常实战总结9
go的context使用讲解
golang 网络爬虫框架gocolly
golang实现桶排序
golang处理gb2312转utf-8编码的问题
golang实现单链的添加,删除以及翻转
go深入
由引用类型引发的概念的深入理解
sync.WaitGroup深入源码理解
golang如何创建动态的struct类型以及如何转换成slice类型
深入理解go的管道数据读写
关于go的只读管道只写管道以及单向管道的理解
深入理解go的slice深入,slice扩容机制
深入理解go的函数参数传递
golang实现动态调用不同struct中不同的方法
如何配置sqlx.DB的SetMaxOpenConns SetMaxIdleConns 和 SetConnMaxLifetime来保证更好的性能
深入理解golang的channel的使用-日常实战总结no.3
阅读:867
分享次数:0
channel就是所谓的通道:在golang中主要是用于不同于传统的多线程并发模型使用共享内存来实现线程间通信。 1:给一个nil的channel发送数据,会直接服务报错。下面代码是例子 package main import "fmt" var c chan int func main() { fmt.Println(c) //这里是给一个nil的channel发送数据,会直接服务报错。下面代码是例子 c <- 1 } 下面是返回错误信息: <nil> fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send (nil chan)]: 2:往一个关闭的channel里面发送数据会引起panic,下面代码是例子 package main import "fmt" func main() { c := make(chan int) fmt.Println(c) //往一个关闭的channel里面发送数据会引起panic,下面代码是例子 close(c) c <- 1 } 下面是返回的信息 0xc0000540c0 panic: send on closed channel 3:往一个关闭的channel里面接受数据,会直接返回 0 ,下面代码是例子 package main import "fmt" func main() { c := make(chan int) fmt.Println(c) //往一个关闭的channel里面接受数据,会直接返回 0 ,下面代码是例子 close(c) fmt.Println(<-c) } 下面是返回的信息 0xc0000540c0 0 针对于上面的例子可能你对channel的使用有了深入的了解,下面我们做一下简单的总结: channel的三种状态 nil:未初始化的状态,只进行了声明,或者手动赋值为nil active:正常的channel,可读或者可写 closed:已关闭,千万不要误认为关闭channel后,channel的值是nil 好了,接下来我们来正确使用channel,带缓冲的和不带缓冲的正确使用。 不带缓冲的正确使用 package main import "fmt" func main() { c := make(chan int) fmt.Println(c) //这里我们必须从另外一个线程里面写入到通道,然后用主线程或者另外一个线程马上进入等待的状态,这样才能使用无缓冲的channel //每一个发送者与接收者都会阻塞当前线程,只有当接受者与发送者都准备就绪了 go func() { c <- 1 }() fmt.Println(<-c) } 下面是返回的信息 0xc0000540c0 1 带缓冲的正确使用 package main import "fmt" func main() { //chan做限速使用 //不带缓冲的channel写完就阻塞,这种情况只有其他协程中有对应的读才能解除阻塞。而带缓冲长度为N的channel要直到写满+N才阻塞。 //这里channel的发送超出了缓冲的大小,所以会因为阻塞而导致程序死锁,如果设置channel为3,<-1这种写入操作最多为3次,不然会造成死锁。 c := make(chan int, 3) c <- 1 c <- 2 c <- 3 fmt.Println(<-c) fmt.Println(<-c) fmt.Println(<-c) } 下面是返回的信息 1 2 3
感觉本站内容不错,读后有收获?
attach_money
我要小额打赏,鼓励作者写出更好的教程
扫码关注公众号:talk_lizhi