管道基本介绍

package main

import “fmt”

/*
为什么需要channel
前面使用全局变量加锁同步来解决goroutine的通讯,但不完美
1)主线程在等待所有goroutine全部完成的时间很难确定,我们这里设置10秒,仅仅是估算。
2)如果主线程休眠时间长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁
3)通过全局变量加锁同步来实现通信,也并不利用多个协程对全局变量的读写操作,
4)上面种种分析都在呼唤一个新的通讯机制-channel

1)channle本质就是一个数据结构-队列[示意图]
2)数据是先进先出[FiFO]:first in first out]
3)线程安全,多goroutine访问时,不需要加锁,就是说channel本身就是线程安全的(不会发生资源竞争问题)
4)channel是有类型的,一个string的channel只能存放string类型数据。
*/
//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

管道初始化
channel初始化
说明:使用make进行初始化
var intChan chan int
intChan = make(chan int,10)
说明+示意图

向channel中写入(存放)数据
var intChan chan int
intChan = make(chan int,10)
num:=999
intChan<-10
intChan<-num

*/
func main(){
//演示一下管道的使用
//1创建一个可以存放3个int类型的管道
var intChan chan int
intChan = make(chan int,3)//管道初始化

//2,看看intChan是什么
fmt.Printf("intChan的值=%v intChan本身的地址=%p\n",intChan,&intChan)

//3.向管道写入数据
intChan<-10
num:=211
intChan<-num

//注意点,当我们给管写入数据时,不能超过其容量
intChan<-50
//如果从channel取出数据后,可以继续放入
<-intChan
intChan<-98//会报错超出了,长度变成4,容量变成4,设置3,注意,当写入数据时,不能超过其容量

 //4.看看管道的长度和cap(容量)
 fmt.Printf("channel len=%v cap=%v\n",len(intChan),cap(intChan))//2,3

 //5.从管道读取数据
 var num2 int
 num2 =<-intChan
 fmt.Println("num2=",num2)
 fmt.Printf("channel len=%v cap=%v\n",len(intChan),cap(intChan))//2,3

 //6.在没有使用协程的情况下,如果我们的管道数据已经全部取出,在取就会报告deadlock
 num3 := <-intChan
 num4 := <-intChan

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

 num5 := <-intChan

 fmt.Println("num3=",num3,"num4=",num4,"num5=",num5)

 /*
 channel使用的注意事项
 1)channel中只能存放指定的数据类型
 2)channle的数据放满后,就不能在放入了
 3)如果从channel去除数据后,可以继续放入
 4)在没有使用协程的情况下,如果channel数据取完了,在取,就会报deadlock
  */

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值