Go并发编程:玩转select语句

简介: Go并发编程:玩转select语句

在 Go 语言中,select 语句是一项强大的工具,用于处理并发的多个通道操作。

本文将探讨如何巧妙地使用 select 语句,通过清晰的示例代码和注释,帮助读者充分理解和灵活运用 select 切换协程的技巧。


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "Channel 1"  }()
  go func() {    time.Sleep(1 * time.Second)    ch2 <- "Channel 2"  }()
  select {  case msg1 := <-ch1:    fmt.Println("Received from", msg1)  case msg2 := <-ch2:    fmt.Println("Received from", msg2)  }}


package main
import (  "fmt"  "time")
func main() {   ch := make(chan string)  go func() {           time.Sleep(2 * time.Second)           ch <- "Data received"  }()
  select {  case msg := <-ch:    fmt.Println(msg)  case <-time.After(1 * time.Second):    fmt.Println("Timeout occurred")      }}


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "Data from Channel 1"  }()
  go func() {    time.Sleep(1 * time.Second)    ch2 <- "Data from Channel 2"  }()
  select {  case msg1 := <-ch1:    fmt.Println(msg1)  case msg2 := <-ch2:    fmt.Println(msg2)  }}


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch <- "Data received"  }()
  select {  case msg := <-ch:    fmt.Println(msg)  default:    fmt.Println("No data received yet")  }}


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    for {      time.Sleep(2 * time.Second)      ch1 <- "Data from Channel 1"    }  }()
  go func() {    for {      time.Sleep(1 * time.Second)      ch2 <- "Data from Channel 2"    }  }()
  for {    select {    case msg1 := <-ch1:      fmt.Println(msg1)    case msg2 := <-ch2:      fmt.Println(msg2)    }  }}


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)  stopCh := make(chan bool)
  go func() {    for {      select {      case msg := <-ch:        fmt.Println(msg)      case <-stopCh:        fmt.Println("Stopping the goroutine")        return      }    }  }()
  time.Sleep(3 * time.Second)  stopCh <- true  time.Sleep(1 * time.Second)}


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "Data from Channel 1"  }()
  go func() {    time.Sleep(3 * time.Second)    ch2 <- "Data from Channel 2"  }()
  select {  case msg1 := <-ch1:    fmt.Println(msg1)  case msg2 := <-ch2    fmt.Println(msg2)  case <-time.After(1 * time.Second):    fmt.Println("Timeout occurred")  }}


package main
import (  "fmt"  "time")
func main() {  var ch chan string
  // 使用nil通道避免select阻塞  select {  case data := <-ch:    fmt.Println(data)  default:    fmt.Println("No data received")  }}



目录
相关文章
|
4月前
|
人工智能 监控 Kubernetes
Go语言在select语句中实现优先级
Go语言中的`select`语句用于监控多个Channel的发送或接收操作,选择就绪的分支执行。它支持多种使用场景,如空`select`永久阻塞、单`case`阻塞读写、多`case`随机选择、配合`default`实现非阻塞操作等。通过嵌套`select`还可实现执行优先级,适用于如Kubernetes中任务调度等实际场景。
|
2月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
4月前
|
Go
理解 Go 语言中的 select 用法
本文深入解析了Go语言中`select`的用法,它类似于`switch case`,但仅用于通道(channel)的操作。文章通过多个示例说明了`select`的基本用法、避免死锁的方法、随机性特点以及如何实现超时机制。同时总结了`select`与`switch`的区别:`select`专用于通道操作,case执行是随机的,需注意死锁问题,且不支持`fallthrough`和函数表达式。
182 1
理解 Go 语言中的 select 用法
|
4月前
|
监控 Go 开发者
深入解析 go 语言中的 select 语句
在 Go 语言中,`select` 是专为并发编程设计的控制结构,用于在多个 channel 操作间进行非阻塞选择。它类似于 `switch`,但所有 case 分支必须是 channel 的 I/O 操作。本文通过通俗易懂的语言和丰富代码示例,详细讲解 `select` 的各种用法,包括基本语法、空 `select`、多分支选择、`default` 分支、特点总结及最佳实践,适合初学者和有经验的开发者学习参考。掌握 `select`,能有效提升 Go 并发编程的灵活性与效率。
138 6
|
4月前
|
数据采集 安全 Go
Go 语言并发编程基础:Goroutine 的创建与调度
Go 语言的 Goroutine 是轻量级线程,由 runtime 管理,具有启动快、占用小、支持高并发的特点。本章介绍 Goroutine 的基本概念、创建方式(如使用 `go` 关键字或匿名函数)、M:N 调度模型及其工作流程,并探讨其在高并发场景中的应用,帮助理解其高效并发的优势。
|
4月前
|
Go 开发者
Go 并发编程基础:无缓冲与有缓冲通道
本章深入探讨Go语言中通道(Channel)的两种类型:无缓冲通道与有缓冲通道。无缓冲通道要求发送和接收必须同步配对,适用于精确同步和信号通知;有缓冲通道通过内部队列实现异步通信,适合高吞吐量和生产者-消费者模型。文章通过示例对比两者的行为差异,并分析死锁风险及使用原则,帮助开发者根据场景选择合适的通道类型以实现高效并发编程。
|
4月前
|
Go 调度 开发者
Go 并发编程基础:select 多路复用
Go 语言中的 `select` 是一种强大的并发控制结构,用于同时监听多个通道操作。它支持随机选择就绪的通道、阻塞等待以及通过 `default` 实现非阻塞通信。结合 `time.After()`,可轻松实现超时机制,适用于网络请求、任务调度等场景。本文详细介绍了 `select` 的基本用法、特性及实战技巧,如合并多通道输入、处理通道关闭等,帮助开发者高效管理协程与通道交互,避免常见陷阱。
|
10月前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
11月前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####
|
11月前
|
算法 安全 程序员
Go语言的并发编程:深入理解与实践####
本文旨在探讨Go语言在并发编程方面的独特优势及其实现机制,通过实例解析关键概念如goroutine和channel,帮助开发者更高效地利用Go进行高性能软件开发。不同于传统的摘要概述,本文将以一个简短的故事开头,引出并发编程的重要性,随后详细阐述Go语言如何简化复杂并发任务的处理,最后通过实际案例展示其强大功能。 --- ###