Golang单方向的channel
ck_god · · 4774 次点击 · · 开始浏览默认情况下,通道是双向的,也就是,既可以往里面发送数据也可以同里面接收数据。
但是,我们经常见一个通道作为参数进行传递而值希望对方是单向使用的,要么只让它发送数据,要么只让它接收数据,这时候我们可以指定通道的方向。
单向channel变量的声明非常简单,如下:
varch1chanint//ch1是一个正常的channel,不是单向的
varch2chan<-float64//ch2是单向channel,只用于写float64数据
varch3<-chanint//ch3是单向channel,只用于读取int数据
l chan<- 表示数据进入管道,要把数据写进管道,对于调用者就是输出。
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")
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
默认情况下,通道是双向的,也就是,既可以往里面发送数据也可以同里面接收数据。
但是,我们经常见一个通道作为参数进行传递而值希望对方是单向使用的,要么只让它发送数据,要么只让它接收数据,这时候我们可以指定通道的方向。
单向channel变量的声明非常简单,如下:
varch1chanint//ch1是一个正常的channel,不是单向的
varch2chan<-float64//ch2是单向channel,只用于写float64数据
varch3<-chanint//ch3是单向channel,只用于读取int数据
l chan<- 表示数据进入管道,要把数据写进管道,对于调用者就是输出。
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")
}