南京网站工作室,深圳市住房和建设局人事调整,餐饮公司做网站好处,什么类型的网站好做#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力#xff0c;虚度你的光阴#xff0c;每天迈出一小步#xff0c;回头时发现已经走了很远。
#x1f4d7;概念 select 语句是 Go 的一种控制结构#xff0c;用于等待多个通道操作。它类似于 s…
Don’t worry , just coding! 内耗与overthinking只会削弱你的精力虚度你的光阴每天迈出一小步回头时发现已经走了很远。
概念 select 语句是 Go 的一种控制结构用于等待多个通道操作。它类似于 switch 语句但用于通道的接收和发送 超时是指在一定时间内未能完成某项操作如接收通道消息或发送消息从而采取某种措施如执行默认操作或返回错误 非阻塞通道操作是指通过 select 语句的 default 分支或者直接在通道操作中尝试发送或接收数据而不会导致 goroutine 阻塞。 代码
通道select
package mainimport (fmttime
)func main() {c1 : make(chan string) // 创建一个字符串类型的通道 c1c2 : make(chan string) // 创建一个字符串类型的通道 c2// 启动第一个 goroutinego func() {time.Sleep(1 * time.Second) // 暂停 1 秒c1 - one // 向 c1 通道发送消息 one}()// 启动第二个 goroutinego func() {time.Sleep(2 * time.Second) // 暂停 2 秒c2 - two // 向 c2 通道发送消息 two}()// 循环接收消息for i : 0; i 2; i {select {case msg1 : -c1: // 从 c1 通道接收消息fmt.Println(received, msg1) // 打印接收到的消息case msg2 : -c2: // 从 c2 通道接收消息fmt.Println(received, msg2) // 打印接收到的消息}}
}//输出
//启动等待一秒后打印 received one
//启动等待2秒后打印 received two因为两个等待是同时执行的所以总执行时间是2秒通道timeout
package mainimport (fmttime
)func main() {c1 : make(chan string, 1) // 创建一个缓冲通道 c1容量为 1go func() {time.Sleep(2 * time.Second) // 暂停 2 秒c1 - result 1 // 向 c1 通道发送 result 1}()// 第一个 select 语句select {case res : -c1: // 尝试从 c1 接收消息fmt.Println(res) // 打印接收到的消息case -time.After(1 * time.Second): // 如果 1 秒后还没有消息则执行此 casefmt.Println(timeout 1) // 打印超时消息}c2 : make(chan string, 1) // 创建另一个缓冲通道 c2容量为 1go func() {time.Sleep(2 * time.Second) // 暂停 2 秒c2 - result 2 // 向 c2 通道发送 result 2}()// 第二个 select 语句select {case res : -c2: // 尝试从 c2 接收消息fmt.Println(res) // 打印接收到的消息case -time.After(3 * time.Second): // 如果 3 秒后还没有消息则执行此 casefmt.Println(timeout 2) // 打印超时消息}
}
//输出
//timeout 1
//result 2Non-Blocking Channel Operations非阻塞通道操作
package mainimport fmtfunc main() {messages : make(chan string) // 创建一个字符串类型的通道 messagessignals : make(chan bool) // 创建一个布尔类型的通道 signals// 第一个 select 语句select {case msg : -messages: // 尝试从 messages 通道接收消息fmt.Println(received message, msg)default: // 如果没有消息可接收则执行此分支fmt.Println(no message received)}msg : hi // 定义消息内容// 第二个 select 语句select {case messages - msg: // 尝试向 messages 通道发送消息fmt.Println(sent message, msg)default: // 如果通道满或没有接收者则执行此分支fmt.Println(no message sent)}// 第三个 select 语句select {case msg : -messages: // 尝试从 messages 通道接收消息fmt.Println(received message, msg)case sig : -signals: // 尝试从 signals 通道接收信号这里是bool类型的通道并没有消息发送进来fmt.Println(received signal, sig)default: // 如果没有消息或信号可接收则执行此分支fmt.Println(no activity)}
}//输出
//no message received
//no message sent
//no activity通道可以用 select 语句来处理消息和信号。select 语句的 default 分支允许在没有可用通道操作时执行其他逻辑避免了阻塞。
理解
select 语句可以有效地等待多个通道的操作确保程序能够及时响应来自不同通道的消息通过使用 time.Sleep 模拟耗时操作可以并发执行的特性。time.After 用于设置超时机制确保程序不会无限期等待通道的消息。select 语句的 default 分支允许在没有可用通道操作时执行其他逻辑避免了阻塞。
无人扶我青云志我自踏雪至山巅。