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. Hadoop Aggregate Resource Allocation解释

    1.在hadoop里面运行程序的时候,查看某个任务的具体信息如下: [hadoop@master monitor]$ yarn application -list 如上图,这里面的Aggregate ...

  2. HNOI2009有趣的数列

    首先next_permutation打表,发现Cat规律. 其实考试的时候这么做没什么问题,而且可以节省异常多的时间,那么现在我们来想一下why. 首先我拿模型法解释一下,我们把2n个数看成2n个人, ...

  3. JVM的内存配置参数

    JVM的结构问题:JVM分两块:PermanentSapce和HeapSpace, HeapSpace = [old + new{=Eden,from,to}] PermantSpace主要负责存放加 ...

  4. 《Glibc内存管理》笔记DAY3

    目录 边界标记法 内容来源 边界标记法 /* conversion from malloc headers to user pointers, and back */ #define chunk2me ...

  5. Java判断整数溢出

    开题报告第一版写完发给老师了,熬了两周终于搞出来了,等着被怼了之后再改吧.晚上选了Leetcode一道简单的题,整数反转,就是将一个int类型的数反转.原本确实很简单,最后出现个问题有意思--整数溢出 ...

  6. Linux make menuconfig打开失败

    OS:Ubuntu 16.04 LTS 使用“make menuconfig”配置kernel时,提示make menuconfig打开失败 $ make menuconfig *** Unable ...

  7. git 和conding.net 超详细超简单安装

    在做一下操作前,希望你能知道 1.什么是git? 可以参考https://blog.csdn.net/a909301740/article/details/81636662 如果还想多了解一下还可以参 ...

  8. Java 签名(SHA1WithRSA、SHA256WithRSA、SHA256withECDSA)

    RSA1.RSA256 签名 public static String MakeSign(String Data) { try { byte[] data = Data.getBytes(); byt ...

  9. 一个Flask应用运行过程剖析

    相信很多初学Flask的同学(包括我自己),在阅读官方文档或者Flask的学习资料时,对于它的认识是从以下的一段代码开始的: from flask import Flask app = Flask(_ ...

  10. Carve Visual Studio2015编译

    下载Carve库  https://github.com/folded/carve 目录结构如下: 用Visual Studio2015打开,点击右键,生成即可 在bin目录下生成了   .lib文件 ...