总结 Golang 中switch和select的异同点

737 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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的相同点和不同点,希望本文的内容对大家的学习或者工作能带来一定的帮助。