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



目录
相关文章
|
26天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
1月前
|
存储 Go 开发者
Go语言中的并发编程与通道(Channel)的深度探索
本文旨在深入探讨Go语言中并发编程的核心概念和实践,特别是通道(Channel)的使用。通过分析Goroutines和Channels的基本工作原理,我们将了解如何在Go语言中高效地实现并行任务处理。本文不仅介绍了基础语法和用法,还深入讨论了高级特性如缓冲通道、选择性接收以及超时控制等,旨在为读者提供一个全面的并发编程视角。
|
27天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####
|
29天前
|
Go 调度 开发者
Go语言中的并发编程:深入理解goroutines和channels####
本文旨在探讨Go语言中并发编程的核心概念——goroutines和channels。通过分析它们的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和运用这两种强大的工具来构建高效、可扩展的应用程序。文章还将涵盖一些常见的陷阱和解决方案,以确保在实际应用中能够避免潜在的问题。 ####
|
1月前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
1月前
|
安全 Java Go
Go语言中的并发编程:掌握goroutine与通道的艺术####
本文深入探讨了Go语言中的核心特性——并发编程,通过实例解析goroutine和通道的高效使用技巧,旨在帮助开发者提升多线程程序的性能与可靠性。 ####
|
1月前
|
Go 开发者
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念,重点介绍了goroutines和channels的工作原理及其在实际开发中的应用。文章通过实例演示如何有效地利用这些工具来编写高效、可维护的并发程序,旨在帮助读者理解并掌握Go语言在处理并发任务时的强大能力。 ####
|
1月前
|
算法 安全 程序员
Go语言的并发编程:深入理解与实践####
本文旨在探讨Go语言在并发编程方面的独特优势及其实现机制,通过实例解析关键概念如goroutine和channel,帮助开发者更高效地利用Go进行高性能软件开发。不同于传统的摘要概述,本文将以一个简短的故事开头,引出并发编程的重要性,随后详细阐述Go语言如何简化复杂并发任务的处理,最后通过实际案例展示其强大功能。 --- ###
|
1月前
|
存储 安全 Go
Go 语言以其高效的并发编程能力著称,主要依赖于 goroutines 和 channels 两大核心机制
Go 语言以其高效的并发编程能力著称,主要依赖于 goroutines 和 channels 两大核心机制。本文介绍了这两者的概念、用法及如何结合使用,实现任务的高效并发执行与数据的安全传递,强调了并发编程中的注意事项,旨在帮助开发者更好地掌握 Go 语言的并发编程技巧。
35 2
|
1月前
|
安全 Go 调度
Go语言中的并发编程:掌握goroutines和channels
在现代软件开发中,并发编程已经成为不可或缺的一部分。Go语言以其简洁的语法和强大的并发特性,成为了开发者的首选之一。本文将深入探讨Go语言中的两个核心概念——goroutines和channels,并通过实际代码示例展示如何使用它们来实现高效的并发处理。无论你是初学者还是有经验的开发者,通过本文的学习,你将能够更好地理解和应用Go语言的并发机制,提升你的编程技能。