首页 > 其他分享 >Go 快速入门指南 - 遍历通道

Go 快速入门指南 - 遍历通道

时间:2022-12-24 18:32:44浏览次数:30  
标签:ch 入门 go range 遍历 Go main 通道

概述

建议先阅读 range, 阻塞通道, 非阻塞通道 等小节。

​range​​ 除了可以遍历字符串、切片、数组等数据结构外,还可以遍历通道。

语法规则

和遍历其他数据结构不同,遍历通道时没有 ​​索引​​ 的概念,只有值,语法如下:

for v := range ch { // v 是从通道接收到的值
// do something ...
}

使用规则

  1. 1. 遍历一个空的通道 (值为 nil) 时,阻塞
  2. 2. 遍历一个阻塞 && 未关闭的通道时,阻塞
  3. 3. 遍历一个阻塞 && 已关闭的通道时,不做任何事情
  4. 4. 遍历一个非阻塞 && 未关闭的通道时,就接收通道内的所有缓存数据,然后阻塞
  5. 5. 遍历一个非阻塞 && 已关闭的通道时,就接收通道内的所有缓存数据,然后返回

例子

遍历一个空的通道

package main

import (
"fmt"
"time"
)

func main() {
var done chan bool

go func() {
for v := range done {
fmt.Printf("v = %v\n", v)
break
}

fmt.Println("range broken") // 执行不到这里
}()

time.Sleep(time.Second)
}

// $ go run main.go
// 没有任何输出

遍历一个阻塞 && 未关闭的通道

package main

import (
"fmt"
"time"
)

func main() {
done := make(chan bool)

go func() {
for v := range done {
fmt.Printf("v = %v\n", v)
break
}

fmt.Println("range broken") // 执行不到这里
}()

time.Sleep(time.Second)
}

// $ go run main.go
// 没有任何输出

遍历一个阻塞 && 已关闭的通道

package main

func main() {
ch := make(chan string)
close(ch)
for v := range ch {
println(v)
}
}

// $ go run main.go
// 没有任何输出

遍历一个非阻塞 && 未关闭的通道

通道中无缓存数据,阻塞

package main

import (
"fmt"
"time"
)

func main() {
ch := make(chan string, 1)

go func() {
for v := range ch {
fmt.Printf("v = %v\n", v)
break
}

fmt.Println("range broken") // 执行不到这里
}()

time.Sleep(time.Second)
}

// $ go run main.go
// 没有任何输出

通道中有 1 个数据

package main

func main() {
ch := make(chan string, 1)
ch <- "hello world"

for v := range ch {
println(v)
}

// 代码执行不到这里
close(ch)
}

// $ go run main.go
// 输出如下
/**
v = hello world
*/

通道中有多个数据

package main

import (
"fmt"
"time"
)

func main() {
ch := make(chan string, 3)
for i := 0; i < 3; i++ {
ch <- "hello world"
}

go func() {
for v := range ch {
fmt.Printf("v = %v\n", v)
}

fmt.Println("range broken") // 执行不到这里
}()

time.Sleep(time.Second)
}

// $ go run main.go
// 输出如下
/**
v = hello world
v = hello world
v = hello world
*/

遍历一个非阻塞 && 已关闭的通道时

通道中无缓存数据,直接返回

package main

func main() {
ch := make(chan string, 1)
close(ch)

for v := range ch {
println(v)
}
}

// $ go run main.go
// 没有输出

通道中有 1 个数据

package main

func main() {
ch := make(chan string, 1)
ch <- "hello world"
close(ch)

for v := range ch {
println(v)
}
}

// $ go run main.go
// 输出如下
/**
hello world
*/

通道中有多个数据

package main

func main() {
ch := make(chan string, 3)
for i := 0; i < 3; i++ {
ch <- "hello world"
}
close(ch)

for v := range ch {
println(v)
}
}

// $ go run main.go
// 输出如下
/**
hello world
hello world
hello world
*/

Go 快速入门指南 - 遍历通道_Go

标签:ch,入门,go,range,遍历,Go,main,通道
From: https://blog.51cto.com/u_15915979/5967444

相关文章

  • Go 快速入门指南 - 互斥锁和定时器
    互斥锁对于任一共享资源,同一时间保证只有一个操作者,这种方法称为 ​​互斥机制​​。关键字 ​​Mutex​​​ 表示互斥锁类型,它的 ​​Lock​​​ 方法用于获取锁,​​U......
  • django中间件
    django中间件相当于django框架的保安,只要数据过来必须经过中间件的校验。django中间件默认有7个。可以在setings内MIDDLEWARE里查看看着是字符串其实底层就是导模块的......
  • Gogs.02.构建本地仓库并上传到远程仓库
    01.通过VSCode构建一个Vue项目,npminitvue@latest配置参数并安装相关依赖  安装完成后,试运行一下,可以看到已还跑起来了; 02.本地仓构......
  • 使用PicGo+阿里云OSS实现md文档图片上传
    使用PicGo+阿里云OSS实现md文档图片上传这次给大家带来的是PicG0+阿里云Oss+typora的图床环境搭建,帮助大家提高工作效率+写博客速度!1.typora安装给大家一个链接:typora,打......
  • django中间件了解的三个方法、基于Django的插拔式设计、cookie与session简介、基于Dja
    目录Django中间件三个了解的方法1.process_view2.process_exception3.process_template_response基于Django中间实现功能的插拔式设计模拟编写一个消息通知功能(微信、qq、......
  • 红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础数据类型(data types)EP02
    Ruby是强类型动态语言,即Ruby中一旦某一个对象被定义类型,如果不通过强制转换操作,那么它永远就是该数据类型,并且只有在Ruby解释器运行时才会检测对象数据类型,它的一切皆为对......
  • Go
    Chapter01编译器是全文翻译,解释器是实时翻译。1.环境搭建1.1MAC&Linux下载编译器:MAC:在golang.google.cn中点击DownloadGo,选择ApplemacOS即可,默认安装路径......
  • 1005.Django自定义过滤器及标签
    一、关于自定义自定义的引入内置函数--------->自定义函数内置模块--------->自定义模板内置过滤器------>自定义过滤器内置标签--------->自定义标签二、文件路径配......
  • 在Dubbo-go中使用TLS加密进行安全通信
    1背景Dubbo-go在Getty/Triple/Grpc三个通信层面支持TLS链路安全通信。2原理2.1证书机制:ps:可以先提前了解非对称加密机制。CA(CertificationAuthority)负责生成根证书......
  • Django
    第1章1.自己开发web框架web种类:第一种,帮你把下面所有的事都做了。Tornado:做了所有的事。第二种,不办你做socket的事,再的都帮你做了。wsgiref:做socket服务......