Go语言Select chan用法小结

 更新时间:2023年09月13日 15:18:30   作者:higher_speeder  
select语句是Go语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作,本文就详细介绍一下如何使用,感兴趣的可以了解一下

select 语句是 Go 语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作。select 语句可以用于以下几种情况:

监听多个通道:你可以同时监听多个通道,一旦其中任何一个通道就绪(有数据可读或可写),select 就会选择第一个就绪的通道执行相关操作。

超时操作:你可以使用 select 结合定时器通道来实现超时操作,以确保不会无限期地等待通道操作完成。

避免阻塞:当某个通道操作可能导致程序阻塞时,select 可以帮助你避免阻塞,以保持程序的响应性。

示例 1:监听多个通道

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

在这个示例中,我们创建了两个协程,每个协程向不同的通道发送消息。然后,在主协程中使用 select 语句监听两个通道,一旦其中一个通道就绪,它就会打印相应的消息。

示例 2:超时操作

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

在这个示例中,我们创建了一个协程,它会在2秒后向通道发送消息。然后,在主协程中使用 select 语句监听通道操作,但也使用 time.After 创建了一个1秒的超时定时器。如果通道操作没有在1秒内完成,超时分支会执行,打印 “Timeout”。

示例 3:避免阻塞

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

在这个示例中,我们同样创建了一个协程,但使用了 select 语句的默认分支(default)。如果通道操作不能立即完成,default 分支会执行,打印 “No message received”,而不会阻塞程序。

到此这篇关于Go语言Select chan用法小结的文章就介绍到这了,更多相关Go Select chan内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang打包成带图标的exe可执行文件

    golang打包成带图标的exe可执行文件

    这篇文章主要给大家介绍了关于golang打包成带图标的exe可执行文件的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-06-06
  • go程序员日常开发效率神器汇总

    go程序员日常开发效率神器汇总

    这篇文章主要介绍了go程序员开发效率神器包含了go常用开发工具,go调试工具,go常用网站,golang常用库,需要的朋友可以参考下
    2022-11-11
  • go语言实现一个最简单的http文件服务器实例

    go语言实现一个最简单的http文件服务器实例

    这篇文章主要介绍了go语言实现一个最简单的http文件服务器的方法,实例分析了Go语言操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • golang中值类型/指针类型的变量区别总结

    golang中值类型/指针类型的变量区别总结

    golang的值类型和指针类型receiver一直是大家比较混淆的地方,下面这篇文章主要给大家总结介绍了关于golang中值类型/指针类型的变量区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • go日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • GoLang Time时间操作函数讲解

    GoLang Time时间操作函数讲解

    在日常开发中,我们避免不了时间的使用,我们可能需要获取当前时间,然后格式化保存,也可能需要在时间类型与字符串类型之间相互转换等。本文将会对 Go time 包里面的常用函数和方法进行介绍,需要的可以参考一下
    2023-01-01
  • 详解Golang实现http重定向https的方式

    详解Golang实现http重定向https的方式

    这篇文章主要介绍了详解Golang实现http重定向https的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • go:垃圾回收GC触发条件详解

    go:垃圾回收GC触发条件详解

    这篇文章主要介绍了go:垃圾回收GC触发条件详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang一些常用的静态检查工具详解

    golang一些常用的静态检查工具详解

    这篇文章主要介绍了golang一些常用的静态检查工具,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 详解Golang中Channel的原理和使用技巧

    详解Golang中Channel的原理和使用技巧

    Channel管道提供了一种机制,它在两个并发执行的协程之间进行同步,并通过传递与该管道元素类型相符的值来进行通信。本文主要介绍了Channel的原理和使用技巧,需要的可以参考一下
    2022-11-11

最新评论