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")  }}



目录
相关文章
|
7天前
|
Go
go之select
go之select
10 0
|
13天前
|
Go
go语言并发编程(五) ——Context
go语言并发编程(五) ——Context
|
13天前
|
Linux Go 索引
go语言并发编程(四) ——再探管道
go语言并发编程(四) ——再探管道
|
13天前
|
存储 缓存 Go
Go语言并发编程(三)——初窥管道
Go语言并发编程(三)——初窥管道
|
13天前
|
存储 Go
go语言并发编程(二)——锁
go语言并发编程(二)——锁
|
13天前
|
Go
如何在Go中进行文件操作以及如何使用协程来实现并发编程
如何在Go中进行文件操作以及如何使用协程来实现并发编程
16 2
|
16天前
|
Go 开发者
探索Go语言的并发编程模型
通过实例详细介绍了Go语言中的并发编程模型,包括goroutine、channel的基本使用和最佳实践。深入剖析如何利用Go的并发特性提高程序性能和效率,适用于初学者和有一定经验的开发者。
|
21天前
|
存储 缓存 算法
【面试宝藏】Go并发编程面试题
探索Go语言并发编程,涉及Mutex、RWMutex、Cond、WaitGroup和原子操作。Mutex有正常和饥饿模式,允许可选自旋优化。RWMutex支持多个读取者并发,写入者独占。Cond提供goroutine间的同步,WaitGroup等待任务完成。原子操作保证多线程环境中的数据完整性,sync.Pool优化对象复用。了解这些,能提升并发性能。
16 2
|
25天前
|
并行计算 Go 数据处理
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
|
2月前
|
安全 Go 调度
Go语言中的并发编程
Go语言自带了强大的并发编程能力,它的协程机制可以让程序轻松地实现高并发。本文将从并发编程的基础概念出发,介绍Go语言中的协程机制、通道和锁等相关知识点,帮助读者更好地理解并发编程在Go语言中的实践应用。