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. ML_Review_PCA(Ch4)

    Note sth about PCA(Principal Component Analysis)   ML6月20日就要考试了,准备日更博客,来记录复习一下这次ML课所学习的一些方法. 博客是在参考老 ...

  2. Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题)

    Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题) 一.总结 一句话总结: Laravel 会首先收集需要写入 Session 的所有数据,并在用户的 ...

  3. POM 标签大全详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 跨平台免费极简的markdown工具

    1. 工具名 typora 2. 工具官网 https://www.typora.io

  5. C++中的函数库

    函数库是由系统建立的具有一定功能的函数的集合. 库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息.用户也可以根据自己的需要建立自己的用户函数库. "cstdlib" ...

  6. sed替换 - 含反斜杠(/)和Shell变量

    sed替换 - 含反斜杠(/)和Shell变量 摘自: https://blog.csdn.net/zhenyongyuan123/article/details/6616263 2011年07月19 ...

  7. Qt编写自定义控件45-柱状标尺控件

    一.前言 这个控件写了很久了,是最早期的一批控件中的一个,和温度计控件类似,都是垂直的进度条,可以设置不同的背景颜色,左侧的刻度也可以自由设定,还提供了动画效果,其实就是开启定时器慢慢的进度到设定的目 ...

  8. Chrome浏览器控制网速的方法

  9. Linux下-bash: Permission denied 或者 sudo: command not found 错误

    有时候执行一个脚本或者运行一个可执行文件时,如执行脚本./foo.sh,会报错-bash: ./foo.sh: Permission denied,你会再试sudo ./foo.sh,发现继续报错su ...

  10. Python扫描器-常用库-Request

    1.常用库-Request 1.1. 介绍 #安装:pip3 install requests #各种请求方式:常用的就是requests.get()和requests.post() >> ...