这个要解决的问题是,比如如果有一个大循环,取自一个大的文件,要进行逻辑处理,那么这个逻辑的代码要放在循环每一行的循环体里面,这样有可能会出现一个for循环的逻辑嵌套,一层又一层,类似俄罗斯套娃.如果放在外面那么就需要把大循环的每一行数据存到一个数组或者切片里面,这样会占很大的内存

那么就可以使用这种技巧来既能解决循环嵌套,又能解决不存在占用大内存的数据

创建一个channel,开启一个goroutine,在groutine里面进行for循环遍历,把每一行的数据发送到channel中
在主groutine里面,读取channel,因为接收者总是比发送者先执行,那么这个地方就会阻塞等待那一个数据到来
这样就形成这样一个良性的同步操作,虽然是在不同的groutine里面执行的,但是总是同步执行的,并且解决了循环嵌套的问题

package main

import "fmt"

import "time"

func main() {
arr := []int{, , , , , }
yields := make(chan int)
go func() {
for _, i := range arr {
//每次这里先打印,然后跳到循环外
fmt.Println("循环内", i)
yields <- i
//这是防止执行太快看不到效果
time.Sleep(time.Second)
}
close(yields)
}()
for i := range yields {
fmt.Println("循环外:", i)
}
}

就是这样的效果

循环内
循环外:
循环内
循环外:
循环内
循环外:
循环内
循环外:
循环内
循环外:
循环内
循环外:

如果那个channel是个有缓存的channel,就会先把缓存数量的全都塞进channel,后循环外才执行,这个在很多的案例里都有使用

yields := make(chan int, )
循环内
循环内
循环内
循环内
循环内
循环内
循环外:
循环外:
循环外:
循环外:
循环外:
循环外:

比如说这样的代码:

    mailboxes := make(chan *imap.MailboxInfo, )
go func() {
imapClient.List("", "*", mailboxes)
}()
//列取邮件夹
for m := range mailboxes {
mailDirs = append(mailDirs, m.Name)
}

这个很像是PHP中的yield的作用,沟通函数内外

[Go] 利用channel形成管道沟通循环内外的更多相关文章

  1. [PHP] yield沟通函数循环内外

    1.yield是函数内外,循环内外沟通用的 , 当你的函数需要返回一个大数组 , 循环的时候需要遍历这个大数组时 , 并且需要多次遍历这个函数的返回值 , 这个是有用的 2.当我也是只需要在一次循环中 ...

  2. 利用channel在goroutins之间控制同步和传递数据

    在java等代码中,我们查询数据库的操作: sql = "select * from ...."; result = db.query(sql) for(item in resul ...

  3. Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信

    这里我们用Windows下的shell来举例: from subprocess import * #因为是举例,就全部导入了 为了方便你理解,我们用一个很简单的一段代码来说明: 可以看见我们利用Pop ...

  4. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。

    哈喽大家好,今天,可乐来给大家分享一下Python中用for循环和while循环打印九九乘法表的操作.由于本人也是刚刚接触Python不长时间,代码也是自己编写的,所以有什么不足之处还请大家多多指教. ...

  5. Java8 利用Lambda处理List集合循环给另外一个List赋值过滤处理

    1.利用stream().forEach()循环处理List; List<String> list = Lists.newArrayList();//新建一个List 用的google提供 ...

  6. 关于变量在for循环内外定义的思考

    在c#或java里面,我们通常会这样写for循环: ;i<;i++) { Console.WriteLine(i); } 前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些: ...

  7. php在循环内外实例化类占用内存比较

    关于php类的实例化和内存的关系,可以这么说:只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间. 代码1: 在循环外实例化类:class ABC{ public $nu ...

  8. [Go] 利用channel实现简单的工作池

    先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里channel中传递一个Car类型,这个类型主要负责具体做的任务也 ...

  9. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)

    原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...

随机推荐

  1. R语言入门1:安装R和RStudio

    R语言入门1:安装R和RStudio 曹务强 中科院遗传学博士研究生 9 人赞同了该文章 1. Windows安装R 在Windows系统上,安装R语言比较简单,直接从R的官方网站下载,按照正常的软件 ...

  2. 【分享】git全套视频教程

    1.课件 https://www.cnblogs.com/wfd360/p/10891140.html 2.教程列表 3.教程下载 3.1.直接在线学习 学习地址:https://study.163. ...

  3. Playbook剧本初识

    目录 1.Playbook剧本初识 2.Playbook变量使用 3.Playbook变量注册 4.Playbook条件语句 5.Playbook循环语句 6.Playbook异常处理 7.Playb ...

  4. 树莓派Raspberry pi安装系统/烧录系统

    一:下载系统文件 1.树莓派官网系统下载链接:https://www.raspberrypi.org/downloads/raspbian/ (也可在百度云盘下载:https://pan.baidu. ...

  5. Error 942 occured during Initialization of Bufq KUPC$S_1_20181023155636

      一台ORACLE实例(Oracle Database 10g Release 10.2.0.5.0)启动时,报"Error 942 occured during Initializati ...

  6. ubuntu 或centos 使用Docker搭建anaconda+python基本环境

    ubuntu 16 使用Docker安装anacondaubuntu docker 安装centos docker 安装搜索可用镜像 docker search anaconda 拉取你中意的镜像 d ...

  7. powershell之utf-8编码

    每次启动powershell后输入:chcp 65001

  8. 重装windows后如何恢复mysql服务

    如果重装系统后之前的mysql还在的话,可又直接恢复,不需要安装: 注意my.ini文件的位置,应该与bin目录同级: 进入cmd,然后进入你的mysql的bin目录,输入命令:mysqld inst ...

  9. 【未完成】【oracle】单引号使用问题

    ‘-’不可以用 原因:

  10. 第04组 Alpha冲刺(2/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(2/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.收集各个组员的进度 2.写博客 展示GitHub当日代码/文档签入记录: 接下 ...