20210423关于 chan与chan 以及关闭的问题 - ziyouzy/2021blog GitHub Wiki
问题源自一个错误:
(cannot close receive-only channel)
具体文章请看:
https://blog.csdn.net/qq_36431213/article/details/83311028
“内置函数关闭一个通道,该通道必须是双向的或仅发送的”
<-chan为仅接收管道,可是表面上看似乎他是仅发送管道啊,其实是需要把接收逻辑结合起来看的:
for baits := some <-chan range{}
仅发送的意思不是“管道”,而是整体的“逻辑”
于是还可以更加拓展性的想明白一个问题,那就是chan<-是属于源,<-chan是数据末端,chan是数据传递的过程
不能“创建”一个<-chan或chan<-,而只能创建一个chan后,对这个chan添加“<-”标记从而实现“声明”这个管道是属于“源头”还是“末端”
同时不能关闭一个仅接收管道,这也符合我一直以来对管道的理解,同时,借助它我可以让我的编程思路更加清晰
ps:我得出了个结论,如果真的可以将一个chan“赋值”给要给<-chan或chan<-,那么river-node的管道都应该是仅发送管道
已得到验证可以将一个chan“赋值”给要给<-chan或chan<-:
arr = make(map[string]byte)
arr["a"] =0x01
arr["b"] =0x02
arr["c"] =0x03
wg :=&sync.WaitGroup{}
baitCh := make(chan byte)
wg.Add(1)
go func(ch chan<- byte,wg *sync.WaitGroup){
defer wg.Done()
defer close(ch)
for _,v := range arr{
ch <-v
time.Sleep(time.Second)
}
}(baitCh,wg)
wg.Add(1)
go func(ch <-chan byte,wg *sync.WaitGroup){
defer wg.Done()
for v :=range baitCh{
fmt.Println(v)
}
}(baitCh,wg)
这么做的本质其实就是为一个管道添加一个“具有相应功能的标记”从而让逻辑更加清晰
**同时,反向去消除标记是不可行的:
如将一个 <-chan 传递给一个 chan,则会报错:
cannot use baitCh (type chan<- byte) as type chan byte in argument to func literal
更不能把一个 <-chan传递给chan<-,已经完整验证并得出结论,具体如下:
testch1 :=make(chan []byte)
testch2 :=make(<-chan []byte)
testch3 :=make(chan<- []byte)
testch2 =testch1//成功
testch3 =testch1//成功
_ =testch2; _=testch3
testch4 :=make(chan<- []byte)
testch5 :=make(chan []byte)
testch5 =testch4//失败
_ = testch5
testch6 :=make(<-chan []byte)
testch7 :=make(chan []byte)
testch7 =testch6//失败
_ = testch7
testch8 :=make(<-chan/*or <-*/ []byte)
testch9 :=make(<-chan/*or <-*/ []byte)
testch9 =testch8//成功
_ = testch9
testch10 :=make(<-chan/*<-*/ []byte)
testch11 :=make(/*<-*/chan<- []byte)
testch11 =testch10//失败
_ = testch11
以上