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

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

开发者学堂课程【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 中的数据放满,就不能再放入数据。

相关文章
|
6月前
|
算法
‘/’ 和 ‘%’ 在编程中的作用【附加练习题】
‘/’ 和 ‘%’ 在编程中的作用【附加练习题】
|
6月前
|
存储 分布式计算 网络协议
流知识超详细总结!一文搞懂!
流知识超详细总结!一文搞懂!
53 5
流知识超详细总结!一文搞懂!
|
前端开发
前端学习笔记202305学习笔记第二十五天-读写流组合使用
前端学习笔记202305学习笔记第二十五天-读写流组合使用
33 0
|
C语言 Python
输入输出白话解析
输入和输出作为我们编程语言里面最基础的内容,其实没有必要在这里白扯,只要告诉大家是input()和print()即可!
85 0
输入输出白话解析
|
网络协议 程序员 测试技术
管道的注意事项和细节(2)|学习笔记
快速学习管道的注意事项和细节(2),使用 select 可以解决从管道取数据的阻塞问题【案例演示】 我们在管道读取数据的时候要 close 管道,如果没有关闭,这个时候他会阻塞,而且会发生死锁,但有些情况如想在不想关闭的情况下也不被阻塞的话,我们就要使用 select
管道的注意事项和细节(2)|学习笔记
|
网络协议 测试技术 Go
封装课堂练习讲解|学习笔记
快速学习封装课堂练习讲解
封装课堂练习讲解|学习笔记
|
网络协议 测试技术 Go
管道的注意事项和细节(3)|学习笔记
快速学习管道的注意事项和细节(3)
|
网络协议 测试技术 Go
管道的注意事项和细节(1)|学习笔记
快速学习管道的注意事项和细节(1)
|
缓存 移动开发 编译器
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
|
存储 算法 测试技术
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
下一篇
无影云桌面