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

以上