20210120再战timerticker(2)关于t与t.C的生命周期 - ziyouzy/2021blog GitHub Wiki
这篇文章还不能get到核心问题
首先我们先聊一下管道的阻塞问题
管道分为有缓存与无缓存管道,这里只探讨无缓存管道:
ch :=make(chan int)
ch <- 1
go func() {
<-ch
fmt.Println("1")
}()
fmt.Println("2")
这样会直接死锁,因为ch<-1被执行后,程序就会立刻被卡在ch<-1这一行
这句也就是所谓的生产者,对于无缓存管道,他必须在消费之之后被定义:
ch :=make(chan int)
go func() {
<-ch
fmt.Println("1")
}()
ch <- 1
fmt.Println("2")
回到t.C的问题
首先他不能被手动close,然而Stop()也不能close他
因此我们唯一需要考虑的只有确保在做整体析构时,他不处于阻塞状态,因为无论是哪种阻塞状态,都意味着当前生命周期无法结束(不能执行到}),会造成{}内所有元素的无法销毁
否则不但t.C不能被销毁,t也不能被销毁