go语言中channel的创建和销毁以及匿名函数的使用
channel
的创建
go语言中,任意类型前面加上关键字chan
即可声明对应类型的通道,创建通道需要使用make,make也用于map 和slice的创建
创建一个通道
/*刚创建的通道是nil*/
var a chan bool
a = make(chan bool)
使用匿名函数创建一个goroutine
go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}// 往通道中写值a <- truefmt.Println("结束....")
}()
按照阻塞的方式读取通道中的值
// 读取的操作是注阻塞的
data := <-a
package mainimport "fmt"func main() {/*通道名 channel*//*刚创建的通道是nil*/var a chan boolfmt.Printf("%T,%v\n", a, a)a = make(chan bool)// 使用匿名函数创建一个`goroutine`go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}a <- truefmt.Println("结束....")}()fmt.Println("main....over.....")// 读取的操作是注阻塞的data := <-afmt.Println(data)fmt.Println("channel demo")
}
通道关闭
package mainimport ("fmt""time"
)func main() {/*关闭通道:close(ch)子goroutine;写10个数据每写一个,阻塞一次,主goroutine读取一次 解除阻塞主goroutine 读取数据每次读取数据,阻塞一次, 子goroutine每次写入一个就解除主阻塞*/cha1 := make(chan int)go sendData1(cha1)//读取数据.使用for循环需要自己判断是否通道关闭/* for {v, ok := <-cha1if !ok {fmt.Println("已经读取了所有的数据......", ok)break}fmt.Println("读取的数据....", v)}*/// 使用for range就可以让range自己判断通道啥时候关闭// cha1关闭的时候,这里range将停止遍历for v := range cha1 {fmt.Println("main ..over....", v)}//单向 只能写数据,不能读数据//ch1 := make(chan <- int)// 单向只能读不能写数//ch2 := make(<- chan int)fmt.Println("channel close")
}func sendData1(cha1 chan int) {for i := 0; i < 10; i++ {time.Sleep(1000 * time.Millisecond)cha1 <- i}close(cha1)
}
使用通道进行数据发送的小例子
// 1. 创建goroutine1, 向 ch1中发送1,100个数
// 2. 创建goroutine2, 向 ch2中发送, 1,-1000的平方
// 3. main函数中从ch2将值取出
package mainimport ("fmt""sync"
)// 1. 创建goroutine1, 向 ch1中发送1,100个数
// 2. 创建goroutine2, 向 ch2中发送, 1,-1000的平方
// 3. main函数中从ch2将值取出var wg1 sync.WaitGroupfunc wg1Fun(ch1 chan int) {defer wg1.Done()for i := 1; i <= 100; i++ {ch1 <- i}close(ch1)
}func wg2Fun(ch2 chan int, ch1 chan int) {defer wg1.Done()for {x, ok := <- ch1if !ok {break}ch2 <- x * x}close(ch2)
}func main() {var ch1 = make(chan int, 100)var ch2 = make(chan int, 100)wg1.Add(2)go wg1Fun(ch1)go wg2Fun(ch2, ch1)wg1.Wait()for v := range ch2 {fmt.Println("get ch2 is ", v)}}
go语言中,对已经关闭的通道进行取值,能够取到,只不过取到的ok为false
package mainimport "fmt"// 对已经关闭的通道进行取值,能够取到不过ok返回的falsefunc main() {ch1 := make(chan bool, 2)ch1 <- truech1 <- true// 关闭通道close(ch1)<- ch1<- ch1x, ok := <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok)
}
go语言中channel的创建和销毁以及匿名函数的使用相关推荐
- 编程c语言中,向上取整函数_C编程中的函数
编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...
- c语言中值程序,编程c语言中,向上取整函数_C编程中的函数
编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...
- 编程c语言中,向上取整函数_C编程中的函数–第3部分
编程c语言中,向上取整函数 Read: Functions in C Programming – Part 2 So far we have learnt about the simplest use ...
- 在C语言中break语句称为,在C语言中,break语句的功能是退出函数
摘要: 燃烧煤中质在中过程所含矿物,语言k语高温和氧化后分解,称为,体残的固留物生成.出函只装锅炉机时称(引风.语言k语锅炉规格都以其公取的常用称压一般为选力和来作阀门上的.... 燃烧煤中质在中过程 ...
- c语言数组数据的输入,在C语言中,数组中的值如何输入到函数中?
我希望这有帮助: #include /* don't need to specify size of array1 here */ /* rather pass the no. of elements ...
- c语言中gets函数可以输入空格吗_C语言中scanf()与gets()函数的区别,哪一个可以读入空格啊?...
展开全部 1.scanf不能接受空格.制表符Tab.回车等:对末尾回车符的处理:把回32313133353236313431303231363533e59b9ee7ad9431333431356634 ...
- R语言中的countif——dplyr包中的filter函数和nrow
今天一早上起来又扑到R上面写笨人的matlab课作业(悲),脑壳一整个晕晕--这份作业是我用R语言从CHIP数据库提取数据,做前期数据处理和变量计算,之后给同组的建模的同学,让她用matlab建模. ...
- c语言stdlib h常用函数,c语言中,头文件stdlib.h主要包含什么函数?
stdlib.h里面定义了五种类型.一些宏和通用工具函数. 类型例如size_t.wchar_t.div_t.ldiv_t和lldiv_t: 宏例如EXIT_FAILURE.EXIT_SUCCESS. ...
- c语言中sign的用法,Excel教程中sign函数用法和实例详解
第一,sign函数用法说明 excel教程中sign函数用于返回数字的符号.正数为1,零为0,负数为-1. sign函数语法:SIGN(number) SIGN符号函数(一般用sign(x)表示)是很 ...
最新文章
- 网红快餐店_在一家快餐店工作解释了AJAX基础知识
- python课堂笔记手抄图片_超简单又漂亮的手抄报图片
- 炸!亿级数据DB秒级平滑扩容!!!
- [翻译中] 使用Wayland替代X, 大幅提高图形速度
- 数据库原理及应用【一】引言
- 05.序列模型 W1.循环序列模型
- 第1篇:Flowable简介
- informix数据库 java 增删改查
- numpy.ndarray.flat/flatten 与 Spark 下的 flatMap
- struts2 拦截器_Struts2令牌拦截器示例
- 0712 - 坚守,加强老本
- python语言程序设计实践教程答案上海交通大学_Python推荐书籍从入门到进阶(珍藏版)...
- PS中的颜色深度1位8位16位32位的解释
- 一元二次方程的解法(Python语言)
- build.gradle配置
- K-Means聚类算法原理及其python和matlab实现
- p牛java安全漫谈学习笔记(2)_反序列化与urldns链(基础)
- 4.25 使用图标集功能标识指定范围的数据 [原创Excel教程]
- Java Script 秒表计时器 ( 源码 + 分析 )
- 在Apple Watch上找不到“i”图标的解决方法
热门文章
- Log4net 中输出日志到文件,文件名根据日期生成
- Web 设计:实现干净代码的12条定律
- hdu 4417(树状数组+离线算法)
- hdu 2045(递推)
- spring核心之IOC
- bzoj4551: [Tjoi2016Heoi2016]树(树链剖分)
- [多媒体]MKV 配音分离提取, 伴奏提取
- Python进阶_wxpy学习:消息处理
- Git学习笔记;Git bash 库同步问题
- Python学习笔记:入门(2)