默认情况下,通道是双向的,也就是,既可以往里面发送数据也可以同里面接收数据。

但是,我们经常见一个通道作为参数进行传递而值希望对方是单向使用的,要么只让它发送数据,要么只让它接收数据,这时候我们可以指定通道的方向。

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

}