golang中的select和switch

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")

扫描二维码关注公众号,回复: 5540939 查看本文章

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

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 会出现死锁的现象。

猜你喜欢

转载自blog.csdn.net/weixin_39594447/article/details/88563766