分享
  1. 首页
  2. 文章

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")

}



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:ck_god

查看原文:Golang单方向的channel

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4774 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏