func randomChain() chan interface{} { // 1 避免丢失数据 nc := make(chan interface{}) count := int64(0) go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("count:", count) count = 0 default: nc <- &Data{rand.Int63()} count++ } } }() return nc } 优化
时间: 2024-02-28 21:53:16 浏览: 65
这段代码存在一个问题,就是在 nc 通道被阻塞时,会导致新的数据被阻塞并丢失。为了解决这个问题,我们可以使用一个带缓冲的通道,这样即使通道被阻塞,新的数据也可以被缓存下来,避免数据丢失。
下面是优化后的代码:
```
func randomChain() chan interface{} {
nc := make(chan interface{}, 100) // 带缓冲的通道
count := int64(0)
go func() {
ticker := time.NewTicker(1 * time.Second)
for {
select {
case <-ticker.C:
fmt.Println("count:", count)
count = 0
default:
select {
case nc <- &Data{rand.Int63()}:
count++
default:
// 如果通道已满,则丢弃数据
}
}
}
}()
return nc
}
```
这段代码使用一个带缓冲的通道,缓冲区大小为 100。当通道已满时,我们使用一个嵌套的 select 语句来检查通道是否已满。如果通道未满,则将新的数据发送到通道中,计数器加一。如果通道已满,则不发送数据,丢弃数据。这样就可以避免数据丢失的问题。
阅读全文