1. 被关闭的chan,读取的时候会返回空值,不会被阻塞,所以在select中需要判断获取的值是否正常。
2.只有写入类型的chan(chan<-)可以被关闭,也就是说关闭channel应该是写入者的责任。多个写入者时,需要在外城使用一个WaitGroup,等所有写入者完成之后再关闭.
3.time.After()函数返回的是一个只读的channel,不需要自己关闭
4.两个goroutine使用两个无缓存的channel互为读写来交换信息时,可能会deadLock,解决方法是使用有缓存的channel或者使用context来交互,后者更符合golang的模式
package main
import (
"fmt"
"time"
)
func main() {
msg := make(chan string)
done := make(chan bool)
until := time.After(600 * time.Microsecond)
go send(msg, done)
for {
select {
case m := <-msg:
fmt.Println(m)
case <-until:
done <- true
return
}
}
}
func send(msg chan<- string, done <-chan bool) {
for {
select {
case <-done:
close(msg)
return
default:
msg <- "helo world"
time.Sleep(100 * time.Microsecond)
}
}
}
上面的代码会出现如下问题: