携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
前言
在golang语言中,由于swich和select在结构上非常相似,所以很容易混淆,这篇文章主要总结一下两者的异同点,具有一定的参考价值,需要的朋友可以参考一下。
相同点
- 两者都是用于流程控制的,都包含case和default语句。
- 如果switch或select的case都不成功,那么会进入default分支。
不同点
- 语法不同,示例如下
select定义如下:
var c1, c2 chan int
select {
case i := <-c1:
fmt.Printf("received ", i, " from c1\n")
case c2 <- 1:
fmt.Printf("send to c2\n")
default:
fmt.Printf("no communication\n")
}
switch定义如下:
var grade string = "B"
var marks int = 90
switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50,60,70 :
grade = "C"
default:
grade = "D"
}
- select只能用于channel的操作,既可以用于channel的数据接收,也可以用于channel的数据发送;switch可以为各种类型进行分支操作,可以为接口类型进行分支判断(通过i.(type))。
- 每个switch后面必须跟随一个条件判断,而select后面没有。
- switch中的case语句为枚举值进行比较,select中的case必须是一个对channel的读或者写的操作。
- 如果select的多个分支都满足条件,则会随机选取其中一个满足条件的分支,而switch是循序执行的。
- select中case语句的表达式可以为一个变量或者两个变量赋值,switch中case后面可以带多个值,使用逗号间隔即可。
- select中default子句总是可运行的,所以没有default的select才会阻塞等待事件;没有运行的case,那将会阻塞事件发生报错(死锁);switch中default语句可以放在任何位置,也可以省略。
- select不支持穿透;switch可以穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough,则会继续执行下一个case,也就是说会执行当前case和下一个case。
总结
以上就是这篇文章的全部内容了,主要总结了一下select和switch的相同点和不同点,希望本文的内容对大家的学习或者工作能带来一定的帮助。