40. range和channel的close | 厚土Go学习笔记

一个 channel 值的发送者可以 close 这个 channel,用以表示没有值会被发送了。接收者可以通过赋值语句的第二个参数来测试 channel 是否被关闭。

当没有值可以接收并且 channel 已经被关闭,则

v, ok := <-ch

之后,ok会被设置为 false。

如果是

for i := range ch

会不断从 ch 接收值,直到 channel 被关闭。

请看示例

package main

import "fmt"

func fibonacci(n int, ch chan int)  {
    x, y := 0, 1
    for i := 0; i < n; i++{
        ch <- x
        x, y = y, x + y
    }
    close(ch)
}

func main() {
    ch := make(chan int, 10)
    go fibonacci(cap(ch), ch)
    for i := range ch{
        fmt.Println(i)
    }
}

运行结果

0
1
1
2
3
5
8
13
21
34

本例的 fibonacci(n int, ch chan int) 就是发送者。按照传送来的 n 值进行循环。循环完毕主动关闭了 ch。接收者利用 for i := range ch 循环接收 ch 传回的每一个值。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-01-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端杂谈

使用vue开发项目需要注意的问题和可能踩到的坑

最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下:

12920
来自专栏小狼的世界

VIM的常用操作

作为Linux开发的必不可少的工具,能够将Vi的功效发挥到极致,必然能够提高我们的工作效率,下面是一些Vi的使用技巧。

14330
来自专栏Objective-C

iOS-UITableView 之 重写 loadView 导致程序崩溃

29160
来自专栏流媒体

gcc用法以及静态/动态链接

-E:只进行预处理,不编译 -S:只编译,不汇编 -c:只编译、汇编,不链接 -g:编译器在编译的时候产生调试信息。 -I:指定include包含文件的...

9320
来自专栏数据结构笔记

Django搭建博客(四):渲染前数据的处理

一个简单得方法就是不直接在模板里使用 date属性,而是使用date属性的year 、month 和 day属性来拼凑我们所需的日期格式。

11220
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Ansible部署多个PHP应用程序

本教程是关于在Ubuntu 14.04上使用Ansible部署PHP应用程序的系列文章中的第三篇。第一个教程涵盖了部署应用程序的基本步骤; 在第二个教程介绍更高...

12200
来自专栏Golang语言社区

配置文件热加载的go语言实现

通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置。假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能...

99850
来自专栏一个爱吃西瓜的程序员

Python爬虫学习--用爬虫抓取糗事百科的笑料

构造一个爬虫需要以下四个步骤:分析目标、下载页面、解析页面、存储内容,其中存储内容暂且不提。(因为我还没学) ◆ 分析目标:我的目标是抓取糗事百科24小时热门笑...

38070
来自专栏从零开始学自动化测试

appium+python自动化52-多点触控MultiAction

MultiAction是针对多点触控操作的,是TouchAction的一个补充模块 TouchAction用法参考前面的一篇:appium+python自动化3...

13710
来自专栏ASP.NET MVC5 后台权限管理系统

Fastreport.net 如何在开发MVC应用程序时使用报表

26740

扫码关注云+社区

领取腾讯云代金券