Below code is from go by example - timers
package main
import (
"time"
"fmt"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
timer1 := time.NewTimer(time.Second * 1)
<-timer1.C
fmt.Println("Timer 1 expired")
timer2 := time.NewTimer(300) //change the duration to be more shorter
go func() {
<-timer2.C
fmt.Printf("Timer 2 expired")
}()
stop2 := timer2.Stop()
if stop2 {
fmt.Printf("Timer 2 stopped")
}
}
如果我运行以上代码,输出结果将会像这样(第一个结果):
Timer 1 expired
Timer 2 stopped
但是,如果我将匿名函数的主体更改为:
fmt.Printf("Timer 2 expired")
<-timer2.C
输出结果仍然像以前一样。我很困惑,为什么第二个输出结果不像(结果二):
Timer 1 expired
Timer 2 expired
Timer 2 stopped
根据我的理解,<-timer2.C会阻塞goroutine的剩余部分,直到计时器通道收到一个值。所以如果我在<-timer2.C之后放置fmt.Printf("Timer 2 expired"),输出将像第一种结果一样。但是,如果我在<-timer2.C之前放置fmt.Printf("Timer 2 expired"),那么我认为打印操作将不会被阻塞。
希望有人能帮忙,谢谢大家。