基础结构
package main
import (
"fmt"
)
func main(){
var action string
fmt.Scanln(&action)
switch action {
case "hello":println("hello")
case "fuck": println("fuck")
default:
println("default")
}
}
注意事项
switch
后无括号- 输入和选择对象类型要一致
case
操作后默认break
,并不会执行后续的case
func main(){ var action string fmt.Scanln(&action) switch action { case "hello": case "fuck": println("fuck") default: println("default") } }
hello
匹配无输出,因为break
了
类型匹配
package main
func main(){
var x interface{}
x = 1
switch x.(type){
case nil:println("nil")
case int:println("int")
case string:println("string")
default:
println("interface")
}
}
interface
可以接收任何对象,这里仅简单记住即可
多条件匹配
package main
import "fmt"
func main(){
var guess int
fmt.Scanln(&guess)
switch guess{
case 1,2,3:println("小")
case 4,5,6:println("大")
default:
println("不准出老千")
}
}
虽然默认break
了,但是可以把相同操作的条件归结为同一个case
。
这样的方式,比java
中的更加简洁了。
取消break
package main
import "fmt"
func main(){
var guess int
fmt.Scanln(&guess)
switch guess{
case 1:fallthrough
case 2:fallthrough
case 3:println("小")
case 4:fallthrough
case 5:fallthrough
case 6:println("大")
default:
println("不准出老千")
}
}
关键字fallthrough
,这样看来好像是取消了break
。
package main
func main(){
switch true {
case true:
println("true")
fallthrough
case false:
println("false")
fallthrough
default:
println("default")
}
}
true
false
default
可以得出结论,fallthrough
的效果是无条件执行下一个case
我们可以利用这个功能进行上面的类似java
的判断。
不过小心一些,它的无条件,可能会进行误操作,需要小心。
和if
的差异
switch
的所有情况,都可以使用if
进行实现,if
的情景却不一定适用于switch
。
本质在于类型
if
的条件是真值匹配,可以由各种元素进行真值的计算case
的条件是类型值匹配,switch
就指定了类型,case
只是判断相等==
所以,case
的局限在于
- 单类型
- 相等匹配
对于多类型,多区间的情况,case
无法进行判断。
如果没有啥想法,反正使用if
绝对没有问题,如果是小量的枚举匹配的话,switch
绝对比if
好用。