** 原理 **
利用有缓冲channel关闭时,第二个返回值并不会立即收到false,而是等到接收端把已经在通道中的数据接收完成之后,才会收到false的特性。
```golang
func test() {
data_channel := make(chan string, 5)
go func(c chan string) {
for {
data, ok := <-c
if !ok {
fmt.Println("channel closed")
break
}
go func(a string) {
fmt.Println("recive data = ", a)
}(data)
time.Sleep(5 * time.Second)
}
fmt.Println("end")
}(data_channel)
for i := 0; i < 10; i++ {
data := fmt.Sprintf("%v", i)
data_channel <- data
fmt.Println("send data = ", data)
}
close(data_channel)
}
```