开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:管道的关闭和遍历】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9756
管道的关闭和遍历
内容介绍
一、读写 channel 课堂练习//课后练习
二、channel 的遍历和关闭
三、channel 遍历和关闭的案例演示
一、读写 channel 课堂练习//课后练习
说明:请完成如下案例
1)创建一个 Person 结构体 [Name,Age,Address]
2)使用 rand 方法配合随机创建10个 Person实例,并放入到 channel 中.
3)遍历 channel ,将各个 Person 实例的信息显示在终端...
二、channel 的遍历和关闭
1、channel 的关闭
使用内置函数 close 可以关闭 channel,当 channel 关闭后,就不能再向 channel 写数据了,但是仍然可以从该 channel 读取数据。
列举案例:
1 package main
2 import (
3 "fmt"
4 )
5
6 func main() {
7
8 intchan := make(chan int,3)
9 intchan<- 100
10 intchan<- 200
11 close(intchan) //close
12 //这时不能够再写入数据到channe1
13 //intchan<- 300
14 fmt.Print1n( "okook~")
15 //当管道关闭后,读取数据是可以的
16 n1 := <-intchan
17 fmt.Println"n1=", n1)
18 }
close 函数:
内建函数 close 关闭管道,该管道必须为双向的或只发送的,它应当只由发送者执行,而不应由接收者执行,其效果是在最后发送的值被接收后停止该通道。在最后的值从已关闭的管道中被接收后,任何对其的接收操作都会无阻塞的成功。对于已关闭的信道,语句∶
x, ok := <-c
还会将 ok 置为 false。
Channel 的关闭可以解决实际问题,解决前面的问题,channel 关闭后,就不能继续写入数据,但是仍可以从其中读取数据
2、channel 的遍历
channel 支持 for--range 的方式进行遍历,请注意两个细节:
1)在遍历时,如果 channel 没有关闭,则会出现 deadlock 的错误
2)在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。
三、channel 遍历和关闭的案例演示
看代码演示:
//遍历管道
intchan2 := make(chan int, 100)
for i := 0; i< 100; i++ {
intchan2<- i*2
//放入100个数据到管道
}
//遍历管道不能使用普通的 for 循环
/ / for i:= 0; i< len( intchan2); i++ {
// }
//在遍历时,如果 channel 没有关闭,则会出现 deadlock 的错误
//在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历close(intChan2)
for v := range intchan2 {
fmt.Print1n("v=", v)
}
应用实例1
请完成 goroutine 和 channel 协同工作的案例,具体要求:
1)开启一个 writeData 协程向管道 intChan 中写入50个整数.
2)开启一个 readData 协程,从管道 intChan 中读取 writeData 写入的数据。
3)注意: writeData 和 readDate 操作的是同一个管道
4)主线程需要等待 writeData 和 readDate 协程都完成工作才能退出