golang中的select和switch

本文探讨了Golang中switch和select的区别与应用。switch用于类型判断,按顺序执行匹配的case;select专用于channel,当多个case同时满足时,会随机选择一个执行,且存在default选项时,即使没有case准备好也会执行。通过实例展示了不同情况下select的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang中的switch 与select结构上有些相似。

下面是switch 对类型的判断,输出不同的值,我觉得它安顺序执行的

var b interface{}
b = "string"
switch b.(type) {
	case string:
		fmt.Println("get string")
	case int:
		fmt.Println("get int")
	default:
		fmt.Println("default")
}

select 与switch结构上有点相似但它使用与switch是不同的

1.  select只能用于chan

2.  进入select中所有的 case都会执行case条件,但是最终中会选择最先接收到信息的case函数体执行.所以select中的default需要考虑一下

实例如下:

a := make(chan bool)
	go func(temp chan bool) {
		time.Sleep(time.Second * 11)
		temp <- true
	}(a)
	select {
	case <-a:
		{
			fmt.Println("ok")
		}
	case <-time.After(time.Second * 10):
		fmt.Println("10")
		// default:
		// 	fmt.Println("default")
	}

select 进入时  <- a 阻塞, time.After(time.Second * 10)开始计时,计算首先完成即执行fmt.Println("10")

如果是这样:

a := make(chan bool)
	go func(temp chan bool) {
		time.Sleep(time.Second * 1)
		temp <- true
	}(a)
	select {
	case <-a:
		{
			fmt.Println("ok")
		}
	case <-time.After(time.Second * 10):
		fmt.Println("10")
		// default:
		// 	fmt.Println("default")
	}

这样的话select 进入时  <- a 阻塞, time.After(time.Second * 10)开始计时,由于a率先完成,所以执行fmt.Println("ok")

如果是这样:

a := make(chan bool)
	go func(temp chan bool) {
		time.Sleep(time.Second * 1)
		temp <- true
	}(a)
	select {
	case <-a:
		{
			fmt.Println("ok")
		}
	case <-time.After(time.Second * 10):
		fmt.Println("10")
	default:
		fmt.Println("default")
	}

这样的话select 进入时  <- a 阻塞, time.After(time.Second * 10),default最先收到,所以执行fmt.Println("default")

思考一下下面程序输出什么?:

a := make(chan bool)
	a <- true
	select {
	case <-a:
		{
			fmt.Println("ok")
		}
	case <-time.After(time.Second * 10):
		fmt.Println("10")
	default:
		fmt.Println("default")
	}

这样程序执行到 a <- true 会出现死锁的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值