开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:管道快速入门案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9754
管道快速入门案例
内容介绍:
一、定义/声明 channel
二、channel 初始化
三、向 channel 中写入(存放)数据
四、管道的初始化,写入数据到管道,从管道读取数据及基本的注意事项
一、定义/声明 channel
var 变量名 chan 数据类型
举例如下:
var intChan chan int (表示 intChan 用于存放int数据)
var mapChan chan map[int]string (表示 mapChan 用于存放 map[int]string 类型)
var perChan chan Person(可以放结构体)
var perChan2 chan *Person(可以放结构体的延伸)
…
说明
1) channel 是引用类型
2)channel 必须初始化才能写入数据,即 make 后才能使用
3)管道是有类型的,intChan 只能写入整数 int
var 变量名称就是管道名,chan 是不能改变的关键字,数据类型表示管道放入什么样类型的数据。
二、channel 初始化
说明:使用 make 进行初始化
var intChan chan int
intChan = make(chan int, 10)
说明+示意图
不使用 make 会报错
3代表大小,int 代表类型
三、向 channel 中写入(存放)数据
var intChan chan int
intChan = make(chan int, 10)
num := 999
intChan <- 10
intChan <- num
引用类型,写入符、读取符
四、管道的初始化,写入数据到管道,从管道读取数据及基本的注意事项:
(1)
package main
import (
"fmt"
)
func main(){
//演示一下管道的使用
//1.创建一个可以存放3个int类型的管道
var intChan chan int
inichan = make(chan int,3)
//2.看看intchanl是什么
fmt.Printf("intchan的值=%v intChan)
可以理解为:内存里有一个 Intchan 指向地址(0xc042074080)后,地址再指向channel管道列队(首地址),编译结果如下:
(2).加入 intchan 本身的地址
fmt.Printf("intchan 的值=%v intChan 本身的地址=%p\n", intChan, intChan, &intChan) 后,可以理解为,存地址的空间也有其本身的地址,编译结果如下:
(3).
1 package main
2 import (
3 "fmt"
4 )
5
6 func main(){
7
8 //演示一下管道的使用
9 //1.创建一个可以存放3个int类型的管道
10 var intChan chan int
11 inichan = make(chan int,3)
12
13 //2.看看intchanl是什么
14 fmt.Printf("intchan的值=%v intChan本身的地址=%p\n", intChan, intChan, &intChan)
15
16 //3. 向管道写入数据
17
18 intchan<- 10
19 num := 211
20 intChan<- num
21
22
23 //4.看看管道的长度和cap(容量)
24 fmt.Printf("channel len= %v cap=%v \n",len(intchan), cap(intChan)) // 2,3
}
长度是2,容量是3,加入了两个数,所以长度为2,容量不会变化,数据最多能加到3,加多了就会发生爆破。
编译结果如下:
(4)
1 package main
2 import (
3 "fmt"
4 )
5
6 func main(){
7
8 //演示一下管道的使用
9 //1.创建一个可以存放3个int类型的管道
10 var intChan chan int
11 inichan = make(chan int,3)
12
13 //2.看看intchanl是什么
14 fmt.Printf("intchan的值=%v intChan本身的地址=%p\n", intChan, intChan, &intChan)
15
16 //3. 向管道写入数据
17
18 intchan<- 10
19 num := 211
20 intChan<- num
21
22 //注意点,当我们给管写入数据时,不能超过其容量
23 intchan<- 50
24 intchan<- 98
25 //4.看看管道的长度和cap(容量)
26 fmt.Printf("channel len= %v cap=%v \n",len(intchan), cap(intChan)) // 2,3
编译结果如下:
(5)
1 package main
2 import (
3 "fmt"
4 )
5
6 func main(){
7
8 //演示一下管道的使用
9 //1.创建一个可以存放3个int类型的管道
10 var intChan chan int
11 inichan = make(chan int,3)
12
13 //2.看看intchanl是什么
14 fmt.Printf("intchan的值=%v intChan本身的地址=%p\n", intChan, intChan, &intChan)
15
16 //3. 向管道写入数据
17
18 intchan<- 10
19 num := 211
20 intChan<- num
21
22 //注意点,当我们给管写入数据时,不能超过其容量
23 intchan<- 50
24 intchan<- 98
25 //4.看看管道的长度和cap(容量)
26 fmt.Printf("channel len= %v cap=%v \n",len(intchan), cap(intChan)) // 3,3
27
28 //5.从管道中读取数据
29
30 var num2 int
31 num2 =<-intChan
32 fmt.Print1n( "num2=", num2)
33 fmt.Printf("channel len= %v cap=%v \n",len(intchan), cap(intChan)) // 2,3
编译结果如下:
(6).在(5)下加上如下代码:
35 //6.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报告deadlock
36
37 num3 :=<-intchan
38 num4 :=<-intchan
39 num5:=<-intchan
40 fmt.Print1n( "num3=", num3,"num4=", num4, "num5=", num5)
41
42 }
编译结果如下:
int 代表类型,3代表大小,先进行声明,注意引用类型,<写入符、-读取符等符号的正确,如果不使用 make 会报错,管道中放入数据需要依次放入,
len 指的是长度,cap 是指容量,容量大小就是 make 的大小,当向管道写入数据时,不能超过其容量,超过会发生报错。管道的价值是一边放,一边取,取完之后还可以继续放入。取出后数据长度减小,但管道容量不会发生变化。