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的创建和销毁以及匿名函数的使用相关推荐

  1. 编程c语言中,向上取整函数_C编程中的函数

    编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...

  2. c语言中值程序,编程c语言中,向上取整函数_C编程中的函数

    编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...

  3. 编程c语言中,向上取整函数_C编程中的函数–第3部分

    编程c语言中,向上取整函数 Read: Functions in C Programming – Part 2 So far we have learnt about the simplest use ...

  4. 在C语言中break语句称为,在C语言中,break语句的功能是退出函数

    摘要: 燃烧煤中质在中过程所含矿物,语言k语高温和氧化后分解,称为,体残的固留物生成.出函只装锅炉机时称(引风.语言k语锅炉规格都以其公取的常用称压一般为选力和来作阀门上的.... 燃烧煤中质在中过程 ...

  5. c语言数组数据的输入,在C语言中,数组中的值如何输入到函数中?

    我希望这有帮助: #include /* don't need to specify size of array1 here */ /* rather pass the no. of elements ...

  6. c语言中gets函数可以输入空格吗_C语言中scanf()与gets()函数的区别,哪一个可以读入空格啊?...

    展开全部 1.scanf不能接受空格.制表符Tab.回车等:对末尾回车符的处理:把回32313133353236313431303231363533e59b9ee7ad9431333431356634 ...

  7. R语言中的countif——dplyr包中的filter函数和nrow

    今天一早上起来又扑到R上面写笨人的matlab课作业(悲),脑壳一整个晕晕--这份作业是我用R语言从CHIP数据库提取数据,做前期数据处理和变量计算,之后给同组的建模的同学,让她用matlab建模. ...

  8. c语言stdlib h常用函数,c语言中,头文件stdlib.h主要包含什么函数?

    stdlib.h里面定义了五种类型.一些宏和通用工具函数. 类型例如size_t.wchar_t.div_t.ldiv_t和lldiv_t: 宏例如EXIT_FAILURE.EXIT_SUCCESS. ...

  9. c语言中sign的用法,Excel教程中sign函数用法和实例详解

    第一,sign函数用法说明 excel教程中sign函数用于返回数字的符号.正数为1,零为0,负数为-1. sign函数语法:SIGN(number) SIGN符号函数(一般用sign(x)表示)是很 ...

最新文章

  1. 网红快餐店_在一家快餐店工作解释了AJAX基础知识
  2. python课堂笔记手抄图片_超简单又漂亮的手抄报图片
  3. 炸!亿级数据DB秒级平滑扩容!!!
  4. [翻译中] 使用Wayland替代X, 大幅提高图形速度
  5. 数据库原理及应用【一】引言
  6. 05.序列模型 W1.循环序列模型
  7. 第1篇:Flowable简介
  8. informix数据库 java 增删改查
  9. numpy.ndarray.flat/flatten 与 Spark 下的 flatMap
  10. struts2 拦截器_Struts2令牌拦截器示例
  11. 0712 - 坚守,加强老本
  12. python语言程序设计实践教程答案上海交通大学_Python推荐书籍从入门到进阶(珍藏版)...
  13. PS中的颜色深度1位8位16位32位的解释
  14. 一元二次方程的解法(Python语言)
  15. build.gradle配置
  16. K-Means聚类算法原理及其python和matlab实现
  17. p牛java安全漫谈学习笔记(2)_反序列化与urldns链(基础)
  18. 4.25 使用图标集功能标识指定范围的数据 [原创Excel教程]
  19. Java Script 秒表计时器 ( 源码 + 分析 )
  20. 在Apple Watch上找不到“i”图标的解决方法

热门文章

  1. Log4net 中输出日志到文件,文件名根据日期生成
  2. Web 设计:实现干净代码的12条定律
  3. hdu 4417(树状数组+离线算法)
  4. hdu 2045(递推)
  5. spring核心之IOC
  6. bzoj4551: [Tjoi2016Heoi2016]树(树链剖分)
  7. [多媒体]MKV 配音分离提取, 伴奏提取
  8. Python进阶_wxpy学习:消息处理
  9. Git学习笔记;Git bash 库同步问题
  10. Python学习笔记:入门(2)