浏览一些代码,我发现了每秒执行某项操作的两种方式:
for {
fmt.Println("This is printed every second")
time.Sleep(time.Second * 1)
}
和
for {
select {
case <-time.After(time.Second * 1):
fmt.Println("This is printed every second")
}
}
除了第一个更具可读性(在我看来),我真的不了解一个相对于另一个的优势。有人知道吗?
(至少有两个原因,您可能想要这样做:
time.Sleep
总是阻止您当前的goroutine,如果您包含默认情况,则在通道上等待可能不会:] timeoutCh := time.After(time.Second)
LOOP:
for {
select {
case <-timeoutCh:
break LOOP
default:
}
// do some work
}
opNotifyCh := op()
select {
case res := <-opNotifyCh:
fmt.Println("Op finished with result:", res)
case <-time.After(time.Second):
fmt.Println("Op timed out")
}
time.After
给您一个channel。您可以使用它做任何您想做的事情-您可以将其传递给函数,可以将其返回给调用者,也可以将其放在结构中-确实可以。这给了您很多自由。