序文
close(channel)
- 会立即关闭写入,此时再写入则panic
- 不会立即关闭读取,数据全部读完再关闭读取
- p1,ok := <- struct 可以在读取方来判断通道是否关闭
- 由于会立即关闭写入,再写入报错,所以写入方需要知道通道关闭,因此应该由写入方来决定是否关闭
有缓冲的情况
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
close(ch)
s, ok := <-ch
fmt.Printf("从 ch 中获取 %d,通道已关闭%#v\n", s, ok)
s2, ok := <-ch
fmt.Printf("从 ch 中获取 %d,通道已关闭%#v\n", s2, ok)
}
无缓冲的情况
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
ch <- 1
close(ch)
}()
time.Sleep(1 * time.Second)
s, ok := <-ch
fmt.Printf("从 ch 中获取 %d,通道已关闭%#v\n", s, ok)
s, ok = <-ch
fmt.Printf("从 ch 中获取 %d,通道已关闭%#v\n", s, ok)
}