golang判断chan channel是否关闭的方法
本文实例讲述了golang判断chan channel是否关闭的方法。分享给大家供大家参考,具体如下:
群里有朋友问,怎么判断chan是否关闭,因为close的channel不会阻塞,并返回类型的nil值,会导致死循环.在这里写个例子记录一下,并且分享给大家
如果不判断chan是否关闭
Notice: 以下代码会产生死循环
package main
import (
"fmt"
)
func main() {
c := make(chan int, 10)
c <- 1
c <- 2
c <- 3
close(c)
for {
fmt.Println(<-c)
}
}
package main
import (
"fmt"
)
func main() {
c := make(chan int, 10)
c <- 1
c <- 2
c <- 3
close(c)
for {
i, isClose := <-c
if !isClose {
fmt.Println("channel closed!")
break
}
fmt.Println(i)
}
}
希望本文所述对大家Go语言程序设计有所帮助。
相关推荐
-
go语言channel实现多核并行化运行的方法
本文实例讲述了go语言channel实现多核并行化运行的方法.分享给大家供大家参考.具体如下: 这里定义一个Add函数,用于返回两个整数的和,使用go 语句进行并行化运算,为了等待各个并行运算结束获得其返回值,需要引入channel 复制代码 代码如下: package main import "fmt" func Add(x int,y int,channel chan int) { sum := library.Add(x,y) fmt.Println(sum)
-
Golang中channel使用的一些小技巧
关闭2次 复制代码 代码如下: ch := make(chan bool) close(ch) close(ch) // 这样会panic的,channel不能close两次 读取的时候channel提前关闭了 复制代码 代码如下: ch := make(chan string) close(ch) i := <- ch // 不会panic, i读取到的值是空 "", 如果channel是bool的,那么读取到的是false 向已经关闭的channel写数据 复制代码 代码
-
Go语言中使用 buffered channel 实现线程安全的 pool
概述 我们已经知道 Go 语言提供了 sync.Pool,但是做的不怎么好,所以有必要自己来实现一个 pool. 给我看代码: 复制代码 代码如下: type Pool struct { pool chan *Client } // 创建一个新的 pool func NewPool(max int) *Pool { return &Pool{ pool: make(chan *Client, max), } } // 从 pool 里借一个 Client func (p *P
-
golang中单向channel的语法介绍
本文主要给大家介绍的是关于golang单向channel语法的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 今天闲来无事补充一下golang的语法知识,想起来看看context的用法,结果碰到了一个没见过的channel语法: // A Context carries a deadline, cancelation signal, and request-scoped values // across API boundaries. Its methods are sa
-
Go语言的管道Channel用法实例
本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- v // 将 v 送入 channel ch. v := <-ch // 从 ch 接收,并且赋值给 v. ("箭头"就是数据流的方向.) 和 map 与 slice 一样,channel 使用前必须创建: ch := make(chan int) 默认情况下,在另一端准备好之前,
-
golang判断chan channel是否关闭的方法
本文实例讲述了golang判断chan channel是否关闭的方法.分享给大家供大家参考,具体如下: 群里有朋友问,怎么判断chan是否关闭,因为close的channel不会阻塞,并返回类型的nil值,会导致死循环.在这里写个例子记录一下,并且分享给大家 如果不判断chan是否关闭 Notice: 以下代码会产生死循环 复制代码 代码如下: package main import ( "fmt" ) func main() { c := make(chan int,
-
js判断子窗体是否关闭的方法
本文实例讲述了js判断子窗体是否关闭的方法.分享给大家供大家参考.具体如下: function InsideMessageAdd() { //window.open()得到子窗体 tip = OpenDialog('UploadFile.html?tp=nbtz', 'msg', 650, 180); //启动timer,判断子窗体是否关闭 timer = window.setInterval("IfWindowClosed()", 500); } var timer; var tip
-
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload来指定或者在<body>里指定.区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行. Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取:而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调
-
golang判断net.Conn 是否已关闭的操作
在多线程的线程里边,用一个线程处理一条连接,如何判断连接已经关闭? 试了一下,如果连接中断,读写会出现这种net.OpError,这个就可以判断是否断开 但是我也不确定有没有更好的方法?如果有的话,希望朋友们不吝赐教 func dealConn(conn net.Conn){ //defer conn.Close() //defer conn.Flush() //长连接里边的读写操作必须放到循环里面这样才能进行多次的读写 // 如果连接已经断开,就把这个线程中断掉,怎么判断这个连接已经断开? t
-
Golang判断struct/slice/map是否相等以及对比的方法总结
目录 前言 == 的对比方式 == 适用的类型 slice和map使用 == channel使用 == struct结构体使用== reflect.DeepEqual() 和cmp.Equal() reflect.DeepEqual() cmp.Equal() cmp和DeepEqual的区别 性能比较 总结 前言 平时开发中对比两个struct或者map.slice是否相等是经常遇到的,有很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是经常容易混淆
-
GoLang使goroutine停止的五种方法实例
目录 1.goroutine停止介绍 2.goroutine停止的5种方法 2.1使用for-range 2.2使用for-select(向退出通道发出退出信号) 2.3使用for-select(关闭退出通道) 2.4使用for-select(关闭多个channel) 2.5使用context包 总结 GoLang之使goroutine停止的5种方法 1.goroutine停止介绍 goroutine是Go语言实现并发编程的利器,简单的一个指令go function就能启动一个goroutine
-
golang实现基于channel的通用连接池详解
前言 golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池.下面话不多说了,来一起看看详细的介绍吧. 功能 * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池中的链接,高效 何为通用? 连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用的是io.Closer接口,只要是实现了该接口的对象都可以被池管理.
-
使用Golang的singleflight防止缓存击穿的方法
在使用缓存时,容易发生缓存击穿. 缓存击穿:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去读dB,这些请求都会击穿到DB,造成瞬时DB请求量大.压力骤增. singleflight 介绍 import "golang.org/x/sync/singleflight" singleflight类的使用方法就新建一个singleflight.Group,使用其方法Do或者DoChan来包装方法,被包装的方法在对于同一个key,只会有一个协程执行,其他协程等待那个
-
Golang实现Directional Channel(定向通道)
通道可以是定向的( directional ).在默认情况下,通道将以双向的( bidirectional )形式运作,用户既可以把值放人通道,也可以从通道取出值;但是,通道也可以被限制为只能执行发送操作( send-only )或者只能执行接收操作( receive-only ). 通常可以叫 定向通道 ,也有人叫 单向通道 ,两者其实都是指向这篇短文要讨论的 Directional Channel . 下面直接举例子说明: package onlyChannelTest import ( "
-
QTabWidget标签实现双击关闭的方法(推荐)
用Qt做ARM,发现Qt4中QTabWidget原生的关闭按键(X)太小,用触摸板很难按到.于是乎想到类似于浏览器的双击关闭功能,因为之前做过C#的资源管理器,以为可以直接绑定DoubleClick,可后来翻遍了也没找到相应的SLOT,结果在QWidget中捕捉信号,就是没有QTabWidget标签的鼠标事件,坑爹那!随后,又在网上各种搜索,结果找到的是各种问题,每一个准确回答出来的.....最后思来想去,实在不行,就用最笨的方法,仿Hock实现! 于是乎,我重载了QTabWidget(由于ta
随机推荐
- asp 延时 页面延迟的三种方法
- 快速解决低版本Xcode不支持高版本iOS真机调试的问题方法
- Django 添加静态文件的两种实现方法(必看篇)
- Asp.net 自带报表的使用详解
- Bootstrap导航条可点击和鼠标悬停显示下拉菜单
- php 时间计算问题小结
- 深入了解Python数据类型之列表
- innodb引擎redo文件维护方法
- 令PHP初学者头疼十四条问题大总结
- Ajax实现的异步传输与验证示例代码
- JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
- sql分页查询几种写法
- SQL语句分组获取记录的第一条数据的方法
- javascript实现仿IE顶部的可关闭警告条
- 解决IIS中应用程序池提供服务的进程无法响应Ping或进程关闭时间超过了限制
- c#二维码生成的代码分享
- JavaScript之排序函数_动力节点Java学院整理
- ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
- 用c语言实现2000内既能被3整除又能被7整除的个数
- android双缓冲技术实例详解