管道的细节和课堂练习|学习笔记

简介: 快速学习管道的细节和课堂练习

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:管道的细节和课堂练习】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9755


管道的细节和课堂练习

 

内容介绍

一、channel 使用的注意事项

二、读写 channel 案例演示

 

一、channel 使用的注意事项

1. channel 中只能存放指定的数据类型

2. channel 的数据放满后,就不能再放入了

3.如果从 channel 取出数据后,可以继续放入

4.在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock

<<案例演示:

var intChan chan int

intChan =make(chan int,3)

 

二、读写 channel 案例演示

1) 创建一个 intChan,最多可以存放3个 int ,演示存3个数据到 intChan,然后再取出这三个 int

func main( ) {

var  intchan  chan  int

intchan = make(chan int,3)

intchan <- 10

intchan <-20

intchan <-10

//因为 intchan的容量为3,再存放会报告 deadlock

//intchan <- 50

num1 :=<- intchan

num2 :=<- intchan

num3 :=<- intchan

//因为 intchan 这时已经没有数据了,再取就会报告 deadlock

//num4 :=<-intchan

fmt.Printf( "num1=%v num2=%v num3=%v", num1, num2,num3)

}

num1=10,num2=20,num3=10. 

2) 创建一个 mapChan,最多可以存放10个 map[string]string的key-val,演示写入和读取。

func main( ){

var  mapChan  chan  map[string]string

mapChan=make(chan map[string]string,10)

m1 := make(map[string]string, 20)

m1["city1"]=“北京”

mi["city2"]=“天津”

m2 := make(map[string]string,20)

m2[ "hero1"]=“宋江”

m2[ "hero2"]=“武松”

//...

mapChan<-m1

mapchan<-m2

存放入的每个数据都是一个 map,使用 map 之前,要先进行 make 操作。

3) 创建一个 catChan,最多可以存放10个 Cat 结构体变量,演示写入和读取的用法

func main() {

var catchan chan Cat

catchan =make(chan cat, 10)

cat1:=Cat{Name:"tom",Age:18,}

cat2 :=catName:"tom~",Age:180,}

catchan<- cat1

catchan<-cat2

//取出

cat11 :=<- catchan

cat22 := <- catchan

fmt.Print1n(cat11,cat22)

}

说明管道是可以存放结构体数据的。

4) 创建一个 catChan2,最多可以存放10个*Cat 变量,演示写入和读取的用法

func main( ) {

var  catchan  chan*cat

catchan = make(chan *Cat,10)

cat1 := Cat{Name: "tom”,Age: 18,}

cat2 := Cat{Name: "tom~", Age:180,}

catchan <- &cat1

catchan <-&cat2

//取出

cat11 :=<- catchan

cat22 :=<-catchan

fmt.Print1n(cat11,cat22)

}

5) 创建一个 allchan,最多可以存放10个任意数据类型变量,

演示写入和读取的用法

func main() {

var allchan chan interface{}

allchan = make(chan interface{},10)

cat1 := Cat{Namx: "tom", Age:18,}

cat2 :=cat{Name: "tom~",Age: 180,}

allchan <- cat1

allchan <- cat2

allchan<-10

allchan <- "jack”

//取出

cat11 :=<- allchan

cat22 :=<- allchan

6) 看下面的代码,会输出什么?

func main() {

var allchan chan interface{}

allchan = make(chan interface(),10)

cat1 := cat{Name: "tom", Age:18,}

cat2 := cat{Name: "tom~",Age:180,}

allchan<- cat1

allchan <- cat2

allchan<-10

a11chan <- "jack"

//取出

cat11=<- allchan

fmt.Println(cat11.Name)

}

会报错,会报错的原因是

举例:

1 package main()

2 import(

3   "fmt"

4 )

5

6 type cat struct (

7   Name string

8   Age int

9  }

10

11 func main() {

12

13 //定义一个存放任意数据类型的管道3个数据

14 //var al1chan chan interface()

15 allchan := make(chan interface(),3)

16

17 allchan<- 10

18 allchan<- "tom jack"

19 cat :=Cat{"小花猫",4}

20 allchan<- cat

21

22 //我们希望获得到管道中的第三个元素,则先将前2个推出

23 <-allchan

24 <-allchan

25

26newcat := <-allchan //从管道中取出的cat是什么?

27

28  fmt.Printf("newcat=%T , newCat=%v\n"",newCat,newCat)

29  fmt.Printf(“newcat.name=%v”,newCat,Name)

30

31  }

提示下列报错内容:

newCat.Name undefined (type interface{ }is interface with no methods)

正确的写法为:

23<-allchan

24<-allchan

25

26 newCat := <-allchan //从管道中取出的 cat 是什么?

27

28fmt.PrintfO"newcat=XT , newCat=%vin"",newcat,newcat)

29

30 }

Channel 中只能放入指定的数据类型,放入别种类型,就会发生报错,管道中的数据是流动的,一边放入,一边取出,但长度不能超过其最大长度,如果 channel 中的数据放满,就不能再放入数据。

相关文章
|
9月前
|
存储 C语言
谭浩强 第六章利用数组处理批量数据
谭浩强 第六章利用数组处理批量数据
88 0
|
9月前
|
存储 编译器 C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(一)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
98 2
|
存储 算法 调度
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
9月前
|
C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(二)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
89 2
|
9月前
|
存储 算法
C标准库函数的工作细节
C标准库函数的工作细节
|
存储 安全 网络安全
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
存储 机器学习/深度学习 Unix
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
|
存储 Unix Linux
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
|
存储 Unix Shell
进程间通信——匿名管道原理及详解(附有案例代码)
进程间通信——匿名管道原理及详解(附有案例代码)
进程间通信——信号原理及详解(附有案例代码)
进程间通信——信号原理及详解(附有案例代码)