💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**在使用channel中,有以下不方便的地方:** 1、在不改变channel自身状态的情况下,是无法获取一个channel是否为关闭的状态; 2、关闭一个已经关闭的channel会导致panic; 3、向一个已经关闭的channel发送数据会导致pannic;以上两种情况都是很危险的。 **如何关闭channel:** 1、使用`defer-recover`机制,可以大胆地关闭channel或者发送数据; 2、使用`sync.Once`保证只关闭一次。 **如何优雅地关闭channel:** 分为一下几种情况: 1、一个sender,一个receiver 2、一个sender,多个receiver 3、多个sender,一个receiver 4、多个sender,多个receiver 前两种情况只需要在sender端关闭即可。 对于第3种情况的解决方案为:增加一个传递关闭信号的channel,receiver通过信号channel下达关闭channel的指令。 ~~~ func main() { rand.Seed(time.Now().UnixNano()) const Max = 100000 const NumSenders = 1000 dataCh := make(chan int, 100) stopCh := make(chan struct{}) for i := 0; i < NumSenders; i++ { go func() { for { select { case <-stopCh: return case dataCh <- rand.Intn(Max): } } }() } go func() { for value := range dataCh { if value == Max-1 { fmt.Println("send stop signal to senders.") close(stopCh) return } fmt.Println(value) } }() select { case <-time.After(time.Hour): } } ~~~