【Golang】✔️走进 Go 语言✔️ 第十七课 select & 超时和非阻塞

举报
我是小白呀iamarookie 发表于 2021/09/10 00:46:36 2021/09/10
2.3k+ 0 0
【摘要】 【Golang】✔️走进 Go 语言✔️ 第十七课 select & 超时和非阻塞 概述select超时非阻塞 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一...

【Golang】✔️走进 Go 语言✔️ 第十七课 select & 超时和非阻塞

概述

Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 17 课)

在这里插入图片描述

select

Select 是 Go 中的一个控制结构. 类似于 switch 语句. 如果没有 case 可运行, select 将会阻塞, 直到有 case 可以运行.

select 语法:

  • 每个 case 都必须是一个通信
  • 所有 channel 表达式都会被求值
  • 所有被发送的表达式都会被求值
  • 如果任意某个通信可以进行, 它就执行, 忽略其他
  • 如果有多个 case 都可以运行, select 会随机挑出一个

在这里插入图片描述

例子:

 package main

import (
	"fmt"
	"time"
)

func main() {

	// 创建通道
	channel1 := make(chan string)
	channel2 := make(chan string)

	go func() {
		time.Sleep(time.Second)
		channel1 <- "1 号"
	}()

	go func() {
		time.Sleep(time.Second * 2)
		channel2 <- "2 号"
	}()

	// select
	for i := 0; i < 2; i++ {
		select {
		
		case msg1 := <- channel1:
			fmt.Println("received", msg1)
		
		case msg2 := <- channel2:
			fmt.Println("received", msg2)
		}
	}
	
}

  
 

输出结果:

received 1 号
received 2
 

超时

超时 (Timeout) 对于连接到外部资源或在不需要绑定执行时间的程序很重要.

例子:

package main

import (
	"fmt"
	"time"
)

func main() {

	// 创建通道
	channel1 := make(chan string)

	// 协程
	go func() {
		time.Sleep(time.Second * 5)
		channel1 <- "1 号"
	}()

	// select
	select {
	
	case msg1 := <-channel1:
		fmt.Println(msg1)
	
	case <-time.After(time.Second * 3):
		fmt.Println("timeout")
	}
	
}

  
 

输出结果:

timeout

  
 

非阻塞

通道的如果同时发送和接收就会阻塞. 但是, 可以使用 select 和 default 字句来实现非阻塞发送, 接收. 也可以实现非阻塞多路通信.

在这里插入图片描述
例子:

package main

import "fmt"

func main() {

	// 创建缓冲通道, 如果不加缓冲, 都会选择defalut
	message := make(chan string, 1)

	// 接收
	select {

	case msg := <- message:
		fmt.Println("收到消息: ", msg)

	default:
		fmt.Println("没有收到消息")
	}

	// 发送
	select {

	case message <- "hello world":
		fmt.Println("send message")

	default:
		fmt.Println("no message")
	}

	// 接收
	select {

	case msg := <- message:
		fmt.Println("收到消息: ", msg)

	default:
		fmt.Println("没有收到消息")
	}

}

  
 

输出结果:

没有收到消息
send message
收到消息 hello world

  
 

在这里插入图片描述

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/119709537

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。