Go语言-switch case | switch中判断多个值、interface conversion: interface {} is float64, not int

Go语言-switch case

背景

当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。但是当选择的分支比较多时,嵌套的 if 语句层数就会很多,导致程序冗长,可读性下降。因此用 switch 语句来处理多分支选择。

Golang语言在流程控制方面也有其他语言所具备的 if、switch、for 三剑客。其中,if、for 用法基本上还算一致。switch的用法差异确实有些大。

  • switch 和其他语言最为不同的一点:没有 break 语句,每个 case 默认都带着break 语句。
  • Golang中switch的特殊用法——fallthrough。 fallthrough 语句的作用是强制执行case后面的没有执行的case代码

switch case

switch 是一个条件语句,用于将一个表达式的求值结果与可能的值的列表进行匹配,并根据匹配结果执行相应的代码。可以认为 switch 语句是编写多个 if-else 子句的替代方式。比较 C 和 Java 等其它语言而言,Go 语言中的 switch 结构使用上更加灵活。

switch var1 {
    
       //前花括号 { 必须和 switch 关键字在同一行。
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

case
每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。(Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止)。一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说不需要特别使用 break 语句来表示结束。因此,程序也不会自动地去执行下一个分支的代码。

在 case 语句之后,不需要使用花括号将多行语句括起来。当代码块只有一行时,可以直接放置在 case 语句之后。可以使用 return 语句来提前结束代码块的执行。

default
可选的 default 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 if-else 语句中的 else,表示不符合任何已给出条件时执行的相关语句。

fallthrough
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。

Golang中switch的特殊用法——fallthrough

switch 从第一个判断表达式为 true 的 case 开始执行,如果 case 带有 fallthrough,程序会继续执行下一条 case,且它不会去判断下一个 case 的表达式是否为 true。

package main

import "fmt"

func main() {
    
    
    num := 2
    switch num{
    
    
    case 1:
        fmt.Println("num的数值是1")
    case 2:
        fmt.Println("num的数值是2")
	fallthrough
    case 3:
        fmt.Println("num的数值是3")
    case 4,5,6:
        fmt.Println("num的数值可能是4,5,6")
    default:
	fmt.Println("执行default语句")
    }
    fmt.Println("程序结束了")
}

go语言switch中判断多个值

go语言中的switch语句,可以非常容易的判断多个值的情况。
go语言switch语句,可以同时匹配多个条件,中间用逗号分隔,有其中一个匹配成功即可

package main
import "fmt"
 
func judge(v int) {
    
    
	switch v {
    
    
	case 1, 3:
		{
    
    
			fmt.Println("v的值为", v)
		}
	default:
		{
    
    
			fmt.Println("未匹配到,v的值为", v)
		}
	}
}
 
func main() {
    
    
	a := 1
	judge(a)
 
	a = 2
	judge(a)
 
	a = 3
	judge(a)
}

代码执行结果:
num的数值是2
num的数值是3
程序结束了

通过代码,我们可以知道 fallthrough 只作用于当前 case,只多向下执行一个 case,而不是执行整个 switch 语句。

Type Switch,判断某个 interface 变量中实际存储的变量类型

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。

Type Switch 语法格式如下:

switch x.(type){
    
    
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}

以上代码执行结果为:

x 的类型 :

golang switch支持哪些数据类型

Java支持
1.switch表达式后面的数据类型只支持byte,short,int整形类型、字符类型char、枚举类型和java.lang.String类型。
2.注意:支持byte,short,int的包装类,因为会自动拆箱

Go语言的switch
支持任何类型

测试一下 float64

package main

import "fmt"

func main() {
    
    
	var num float64
	num = 1.0
	switch num {
    
    
	case 1:
		fmt.Println("num的数值是1")
	case 2:
		fmt.Println("num的数值是2")
		fallthrough
	case 3:
		fmt.Println("num的数值是3")
	case 4, 5, 6:
		fmt.Println("num的数值可能是4,5,6")
	default:
		fmt.Println("执行default语句")
	}
	fmt.Println("程序结束了")
}

工作中遇到问题,interface conversion: interface {} is float64, not int

问题描述:
工作遇到,使用 map[string]interface{} json映射到map,拿到一个变量,日志打印出来是 1,但是 switch case 是1的死活匹配不上。

先debug,发现我的数据是float64类型,但是写demo float64 go 的switch应该也支持呀。为了更保险,一般case 都用整数,所以我考虑先强转为int。结果发生报错: interface conversion: interface {} is float64, not int

问题分析:
interface {} 接口类型不可以直接强转成 int 整形类型。 interface {} 接口类型是 float64 类型,如果想要得到 int 整形数值,需要先转换成 float 类型。

注意:不要只看打印,你看打印结果是1但是却没有匹配到 case 1:, interface{} 用之前都得手工转 xxx.(float64),打印能打出来,是因为go打印时自己内部做了这个工作。

其他参考
解决:interface conversion: interface {} is float64, not int
参考URL: https://developer.aliyun.com/article/850297

go语言中switch语句的注意事项

go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch

猜你喜欢

转载自blog.csdn.net/inthat/article/details/127308743