Go语言Select chan用法详解

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”,而不会阻塞程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中提到,GO语言关键字"chan"用于定义通道(channel)。通道是一种用于在协程(goroutine)之间传递数据的机制,类似于消息队列。在GO语言中,可以使用关键字"chan"来声明通道变量,例如"var ch chan string"。通道可以是无缓冲的(阻塞型通道)或有缓冲的(缓冲型通道)。无缓冲的通道在接收数据前会阻塞发送方,直到有接收方准备好接收数据。有缓冲的通道可以在缓冲区未满时发送数据,而不会阻塞发送方。\[1\] 在引用\[2\]中的示例代码中,可以看到使用了关键字"chan"来定义了两个通道变量c1和c2。这些通道用于在并行协程中传递数据。通过使用关键字"select",可以选择等待多个通道操作,从而实现并发的控制流程。在示例代码中,使用了"select"来等待c1和c2通道的值,并根据接收到的值进行相应的处理。\[2\] 综上所述,关键字"chan"在GO语言中用于定义通道,通道是一种用于在协程之间传递数据的机制,可以通过关键字"select"来选择等待多个通道操作。 #### 引用[.reference_title] - *1* *2* *3* [go语言的25个关键字(基础)](https://blog.csdn.net/Zoffan/article/details/123028545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值