golang select {} 和 for {} 的区别

 

select {} 与 for {} 在 Go 语言中都是循环结构,但它们的行为和用途有所不同:

 

select {}:

  是一个无限阻塞的 select 语句,没有指定任何 case。

  主要用于等待通道操作或其他事件,在没有明确的通信或信号需求时保持运行状态。

  当程序需要在没有明确结束条件的情况下保持运行,并且可能在将来根据通道或其他可选择的条件改变执行流程时使用。

  不消耗 CPU 资源,因为它会一直阻塞直到有可运行的 case 出现(此处没有,所以永久阻塞)。

 

for {}:

  是一个无限循环结构,不带循环条件,意味着它会无休止地执行。

  更适合于需要持续执行某段代码直到外部干预(如 os.Interrupt 信号)停止循环的场景。

  在循环体内通常会有一些逻辑处理或者延时操作以避免无限制的 CPU 占用。


实例:
  在 Caddy 的 run 命令中,select {} 位于函数 cmdRun 的末尾,其作用是让 Caddy 服务器在成功启动并加载配置后保持运行状态,等待潜在的外部信号或事件(尽管这些处理不是在这个 select 语句中直接完成的,但 select 块会阻塞,使得主goroutine不会退出,从而保持程序运行)。

  虽然使用 for {} 也可以达到类似的效果,但在这种场景下使用 select {} 更能体现等待潜在通道操作的意图,同时也更加节省资源。

 

Link:https://www.cnblogs.com/farwish/p/18248434

posted on 2024-06-14 23:19  ercom  阅读(14)  评论(0编辑  收藏  举报