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