20210423关于 chan与chan 以及关闭的问题(2) - ziyouzy/2021blog GitHub Wiki
后来又想了想,发现了一个新问题:那就是只写操作没意义啊,写进去之后读不了,那岂不成了死胡同了
似乎这样一来唯一的用法就只剩下先为这个chan声明具体容量,然后容量满了之后触发某种信号(比如析构其所在对象之类的)
后来看了这篇文章想明白了:
https://blog.csdn.net/chenchongg/article/details/86589395?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
为一个chan添加只读/写标签其实是一种“面向线程的行为”
也就是说,无论主线程还是子携程,是哪个线程添加的标签,就是声明了“这个线程对这个管道只拥有哪种权限”,而不排除其他携程会拥有不同的权限,如最初的例子就是这样:
func mianthread(){
mainCh :=make(chan byte)
wg.Add(1)
/*子携程a*/
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)
/*子携程b*/
go func(ch <-chan byte,wg *sync.WaitGroup){
defer wg.Done()
for v :=range baitCh{
fmt.Println(v)
}
}(baitCh,wg)
}
子携程a的参数表必然属于子携程a,于是此操作声明了:子携程a对主携程的mainCh拥有只写权限
子携程b的参数表必然属于子携程b,于是此操作声明了:子携程a对主携程的mainCh拥有只读权限