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. 2019CSP-S初赛知识点汇总

    0x00 基本算法 0x01 位运算 0x02 前缀和与差分 0x03 二分 0x04 倍增 0x05 排序 0x06 离散化 0x07 高精度 0x10 数据结构 0x11 栈和队列 0x12 链表 ...

  2. Qt的插件开发

    写代码都是从不会到会,那么写博客也是同样的道理.从不会到会最实用的办法就是模仿了.关于Qt的知识很多都是学习了CSDN的一位大神 一去二三里.关于Qt插件的开发,我们也从他的文章里面抽丝剥茧,把最本质 ...

  3. Java实现通过IP获取域名,通过域名获取IP

    一.通过Linux命令实现 ping www.baidu.com nslookup www.baidu.com nslookup 14.215.177.166 为什么这个命令会有一个192.168.1 ...

  4. 2018-2019-2 20165114《网络对抗技术》Exp7 网络欺诈防范

    Exp7 网络欺诈防范 目录 一.实验内容 二.基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 三.实践过程记录 3.1简单应用SET ...

  5. thymeleaf 直接调用后台Service

    前端thymeleaf <select name="sex" class="form-control m-b" th:with="type=${ ...

  6. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  7. linux的常见目录

    常见的目录和作用 目录名 目录名的作用 /bin/ 存放系统命令的目录,普通用户和root都使用,不过放在bin/命令下的单用户模式也可执行 /sbin/ 保存于系统环境相关的命令,只有root可以使 ...

  8. Alpha冲刺(2/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11885037.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  9. O缺缺缺缺氧 O缺缺氧

    2019 1.18 优雅的退出/关闭/重启gunicorn进程 Ubuntu查看端口占用情况 微信小程序解决 加载图片出现渲染层网络层错误 更改Ubuntu默认python版本的方法 JS/HTML格 ...

  10. [Java]某日期时间加上若干分钟得到新的日期时间

    使用Java自带类库实现日期时间增减还是比自己人工拆分编写要牢靠,代码也简洁多了. 下面代码实现了在原有日期时间上加上一些分钟得到新的日期时间的功能,稍加改造还可以实现逆向运算. 代码: packag ...