对于以下的方法<br/>
<pre>
func A(){ <br/>
ch:=make(chan error)<br/>
for i:=0;i<10;i++{<br/>
go func(){<br/>
ch<-errors,New("www")<br/>
}()<br/>
}<br/>
for{<br/>
select{<br/>
case err:=<-ch:<br/>
return<br/>
}<br/>
}<br/>
}<br/>
</pre>
若main方法执行A后不被kill掉,这个方法会不会生成8个挂起不释放的goroutine啊?要是会应该怎么解决呢?
应该会产生9个挂起的goroutine,发送了10个,只接收了一个,不明白8个是怎么算出来的。
最简单的解决方法是设置chan的长度:
```go
ch := make(chan error, 10)
```
比较复杂的方法涉及到对发送的数据计数:
```go
var (
mu sync.Mutex
counter int
)
func A() {
ch := make(chan error)
for i := 0; i < 10; i++ {
counter++
go func() {
ch <- errors.New("")
defer func() {
mu.Lock()
defer mu.Unlock()
counter--
if counter == 0 {
close(ch)
}
}()
}()
}
defer func() {
for range ch {
}
}()
for {
select {
case <-ch:
return
}
}
}
```
#1