Go 语言使用通道控制循环结束并执行后续代码
可以使用通道来实现定时或根据条件结束循环,并执行后续代码。具体实现方式如下:
-
定义一个通道
done,用于控制循环的结束。 -
在循环中,通过
select语句监听done通道和定时器通道time.After,如果其中任意一个通道被触发,则退出循环。 -
如果循环是因为定时器触发而退出的,则执行定时器后续的代码;如果是因为
done通道被触发而退出的,则执行done后续的代码。
下面是一个示例代码:
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
go func() {
time.Sleep(3 * time.Second)
done <- true
}()
for {
select {
case <-done:
fmt.Println('done')
// 执行后续代码
return
case <-time.After(5 * time.Second):
fmt.Println('timeout')
// 执行后续代码
return
default:
// 循环体代码
fmt.Println('working')
time.Sleep(1 * time.Second)
}
}
}
在上面的示例中,循环体代码会每隔一秒钟输出一次'working',同时通过 default 分支保证 select 语句不会阻塞。当定时器触发或 done 通道被写入时,select 语句会立即退出循环,并根据触发通道的不同执行不同的后续代码。
原文地址: https://www.cveoy.top/t/topic/lrWM 著作权归作者所有。请勿转载和采集!