1.channel的读取与声明

//goroutine之间利用channel进行通信
package main import (
"fmt"
"time"
) func readChan (c chan int) {
//读取通道中的内容
a := <- c
fmt.Println(a)
} func readChan2 (c chan int) {
//读取通道中的内容
a := <- c
fmt.Println(a)
} func main () {
var intChan chan int
intChan = make(chan int, 3) intChan <- 3
intChan <- 2
intChan <- 1 //通道和队列一样,先进先出
go readChan(intChan) //3 go readChan2(intChan) //2 time.Sleep(time.Second * 10)
}

  channel 和队列是一样,先进先出的。

2. 带缓冲区的通道声明与通道阻塞

//通道阻塞
package main import (
"fmt"
"time"
) func write (c chan int) {
for i := 0; i < 100; i++ {
c <- i
fmt.Printf("put data %d\n", i)
}
} func read (c chan int) {
for i := 0; i < 100; i++ {
a := <- c
fmt.Println(a)
time.Sleep(time.Second)
}
} func main () {
//带缓冲区的通道,这个缓冲区的大小为10
chan01 := make(chan int, 10) //只写不读在通道达到长度10后,通道满了,会发送阻塞,不能在继续写入数据了
go write(chan01)
go read(chan01) time.Sleep(10 * time.Second)
}

  输出结果为

  

3. 关闭通道 close(channel)

  

package main 

import (
"fmt"
) func main () {
chan01 := make(chan int, 10) for i := 0; i < 10; i++ {
chan01 <- i
} //close 关闭通道
close(chan01) //这么写会不停输出,因为读取10条后,chan01已经关闭
// for {
// b := <- chan01
// fmt.Println(b)
// } //1.使用ok来判断
// for {
// b, ok := <- chan01
// if ok == false {
// fmt.Println("chan is close")
// break
// }
// fmt.Println(b)
// } //2使用for range 遍历
for v := range chan01 {
fmt.Println(v)
}
}

  关闭通道后,判断有两种方法1.参数ok来判断;2 for ...range  判断,通道关闭后会自动退出。

4. channel select 的应用

//channel select 操作
package main import (
"fmt"
"time"
) func main () {
chan01 := make(chan int, 10)
chan02 := make(chan int, 10) for i := 0; i < 10; i++ {
chan01 <- i
chan02 <- i*i
} for {
select {
case v := <- chan01:
fmt.Println(v)
case v := <- chan02:
fmt.Println(v)
default:
fmt.Println("time out")
time.Sleep(time.Second)
}
} }

  

  

golang goroutine进行通信 channel的更多相关文章

  1. golang goroutine的调度

    golang goroutine的调度 1.什么是协程? 协程是一种用户态的轻量级线程. 2.进程.线程.协程的关系和区别: * 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. ...

  2. Golang学习笔记:channel

    channel channel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任 ...

  3. go实例之轻量级线程goroutine、通道channel与select

    1.goroutine线程 goroutine是一个轻量级的执行线程.假设有一个函数调用f(s),要在goroutine中调用此函数,请使用go f(s). 这个新的goroutine将与调用同时执行 ...

  4. Golang并发编程进程通信channel了解及简单使用

    概念及作用 channel是一个数据类型,用于实现同步,用于两个协程之间交换数据.goroutine奉行通过通信来共享内存,而不是共享内存来通信.引用类型channel是CSP模式的具体实现,用于多个 ...

  5. golang协程——通道channel阻塞

    新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯 ...

  6. [GO语言的并发之道] Goroutine调度原理&Channel详解

    并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go ...

  7. 说说Golang goroutine并发那些事儿

    摘要:今天我们一起盘点一下Golang并发那些事儿. Golang.Golang.Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱 ...

  8. go/wiki/MutexOrChannel Golang并发:选channel还是选锁?

    https://mp.weixin.qq.com/s/JcED2qgJEj8LaBckVZBhDA https://github.com/golang/go/wiki/MutexOrChannel M ...

  9. golang goroutine 介绍

    Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的. 反正现在不是抢占式的.) 不能设置 ...

随机推荐

  1. 上传本地文件到github仓库

    第一步:新建仓库 给仓库一个名字,备注 得到仓库地址: https://github.com/Lucasli2018/java-1-mybatis.git 第二步:进入要上传的文件夹,初始化上传文件夹 ...

  2. checkbox后台传个list显示和回显的页面代码C标签

        <c:forEach items="${listtest}" var="provinces">        <input type= ...

  3. Qt学习大全

    这边文章的目的是把自己之前写的关于Qt的文章整理归纳成一个Qt学习的专栏,会提供之前文章的导航,同时也会留一些坑待自己日后填. 1.Qt 元对象系统 2.Qt的信号和槽 3.Qt的插件开发 4.Qml ...

  4. Choosing a fast unique identifier (UUID) for Lucene——有时间再看下

    Most search applications using Apache Lucene assign a unique id, or primary key, to each indexed doc ...

  5. RK3399 focaltech敦泰触摸屏移植调试

    CPU:RK3399 系统:Android 7.1 IC:FT5406 focaltech(敦泰)触摸屏也是比较常用的,但是相对汇顶,就比较少用 RK的源码中虽然有 focaltech 的代码,但没有 ...

  6. 关于路由跟踪指令---traceroute

    我们都用过ping命令来检查主机与目标地址是否连通,自己的主机与目标地址的通讯包通讯速率,所谓的通讯包也就是那些什么TCP/IP,UDP包. 原理:https://www.cnblogs.com/be ...

  7. 构建Hadoop监控共同体

    HDFS监控背后那些事儿,构建Hadoop监控共同体 原创: 应用研发部 京东云 2018-12-19 https://mp.weixin.qq.com/s/kulwDgwu-rYf4SvQ1dOwc ...

  8. 007-多线程-JUC集合-Queue-BlockingQueue接口以及ArrayBlockingQueue

    0.BlockingQueue接口介绍 BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利 ...

  9. load ifc

    void setRootNode( osg::Group* root ) { m_main_view->setSceneData( root ); if( m_hud_camera ) { ro ...

  10. labelimg data

    <annotation> <folder>img_data_box_1500</folder> <filename>798.jpg</filena ...