Golang单方向的channel
默认情况下,通道是双向的,也就是,既可以往里面发送数据也可以同里面接收数据。
但是,我们经常见一个通道作为参数进行传递而值希望对方是单向使用的,要么只让它发送数据,要么只让它接收数据,这时候我们可以指定通道的方向。
单向channel变量的声明非常简单,如下:
varch2chanint//ch2是一个正常的channel,不是单向的
varch3chan<-float64//ch3是单向channel,只用于写float64数据
varch4<-chanint//ch4是单向channel,只用于读取int数据
lchan<- 表示数据进入管道,要把数据写进管道,对于调用者就是输出。
l<-chan 表示数据从管道出来,对于调用者就是得到管道的数据,当然就是输入。
可以将 channel 隐式转换为单向队列,只收或只发,不能将单向 channel 转换为普通 channel:
c:=make(chanint,3)
varsendchan<-int=c//send-only
varrecv<-chanint=c//receive-only
send<-1
//<-send//invalidoperation:<-send(receivefromsend-onlytypechan<-int)
<-recv
//recv<-2//invalidoperation:recv<-2(sendtoreceive-onlytype<-chanint)
//不能将单向 channel 转换为普通 channel
d1:=(chanint)(send)//cannotconvertsend(typechan<-int)totypechanint
d2:=(chanint)(recv)//cannotconvertrecv(type<-chanint)totypechanint
示例代码:
//chan<-//只写
funccounter(outchan<-int){
deferclose(out)
fori:=0;i<5;i++{
out<-i//如果对方不读会阻塞
}
}
//<-chan//只读
funcprinter(in<-chanint){
fornum:=rangein{
fmt.Println(num)
}
}
funcmain(){
c:=make(chanint)//chan//读写
gocounter(c)//生产者
printer(c)//消费者
fmt.Println("done")
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。