Go 语言 switch 语句 获取interface变量的实际Type类型

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

x.(type)相当于变量x的Type类型,即:reflect.TypeOf(x).Name()

注意区别x的Kind类型;

type BaseController struct {
}

func main() {
	var x interface{}
	x = BaseController{}
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x 的类型 :%T",i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是 func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型" )
	case struct{}:
		fmt.Printf("x 是 struct{}" )
	case BaseController:
		fmt.Printf("x 是 BaseController" )
	default:
		fmt.Printf("未知型")
	}
}

打印输出:

	fmt.Println(fmt.Sprintf("\nx 的Type类型:%v", reflect.TypeOf(x).Name()))
	// 打印: x 的Type类型:BaseController

	fmt.Println(fmt.Sprintf("\nx 的Kind类型:%v", reflect.TypeOf(x).Kind()))
	// 打印: x 的Kind类型:struct

2、看结构体指针类型

type BaseController struct {
}


func main() {
	var x interface{}
	x = &BaseController{}
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x 的类型 :%T",i)
	case int:
		fmt.Printf("x 是 int 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型" )
	case struct{}:
		fmt.Printf("x 是 struct{}" )
	case *BaseController:
		fmt.Printf("x 是 *BaseController" )
	default:
		fmt.Printf("未知型")
	}
	// 打印: x 是 *BaseController

	fmt.Println(fmt.Sprintf("\nx 的Type类型:%v", reflect.TypeOf(x).Name())) // 空值
	// 打印: x 的Type类型:

	fmt.Println(fmt.Sprintf("\nx 的Kind类型:%v", reflect.TypeOf(x).Kind()))
	// 打印: x 的Kind类型:ptr
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录 1. 介绍 1 1.1 Hello, world 1 1.2 类型 2 1.2.1 预定义类型 3 1.2.2 转换 5 1.2.3 数组类型 6 1.2.4 类型系统一致 7 1.3 变量和参数 8 1.4 自动内存管理 11 1.5 表达式 13 1.6 声明 14 1.7 类 17 1.7.1 常数 19 1.7.2 域 19 1.7.3 方法 20 1.7.4 属性 21 1.7.5 事件 22 1.7.6 操作符 23 1.7.7 索引 24 1.7.8 实例构造函数 25 1.7.9 析构函数 26 1.7.10 静态构造函数 26 1.7.11 继承 27 1.8 结构 28 1.9 接口 29 1.10 代表 30 1.11 联合 31 1.12 名称空间和集合 31 1.13 版本 33 1.14 特征 35 2. 语法结构 37 2.1 翻译的阶段 37 2.2 文法符号 37 2.3 预处理 38 2.3.1 预处理声明 38 2.3.2 #if, #elif, #else, #endif 39 2.3.3 预处理控制行 40 2.3.4 #line 41 2.3.5 预处理标识符 41 2.3.6 预处理表达式 41 2.3.7 与空白交互作用 42 2.4 语法分析 43 2.4.1 输入 43 2.4.2 输入字符 43 2.4.3 行结束符 43 2.4.4 注释 43 2.4.5 空白 44 2.4.6 标记 45 2.5 句法分析 45 2.5.1 标识符 45 2.5.2 关键字 46 2.5.3 数据符号 46 2.5.4 操作符和标点 51 2.5.5 Unicode 字符转意字符序列 51 3. 基本概念 53 3.1 声明 53 3.2 成员 55 3.2.1 名称空间成员 55 3.2.2 结构成员 55 3.2.3 枚举成员 55 3.2.4 类成员 56 3.2.5 接口成员 56 3.2.6 数组成员 56 3.2.7 代表成员 56 3.3 成员访问 56 3.3.1 声明可访问性 56 3.3.2 可访问性域 57 3.3.3 保护的访问 59 3.3.4 可访问性约束 60 3.4 签名和重载 60 3.5 范围 61 3.5.1 名称隐藏 63 3.6 名称空间或类型名称 65 3.6.1 合格的名称 66 4. 类型 67 4.1 数值类型 67 4.1.1 默认构造函数 68 4.1.2 结构类型 69 4.1.3 简单类型 69 4.1.4 整数类型 70 4.1.5 浮点类型 71 4.1.6 十进制类型 72 4.1.7 布尔类型 72 4.1.8 枚举类型 72 4.2 引用类型 72 4.2.1 类类型 73 4.2.2 对象类型 73 4.2.3 字符串类型 73 4.2.4 接口类型 74 4.2.5 数组类型 74 4.2.6 代表类型 74 4.3 包装和解包 74 4.3.1 包装转换 74 4.3.2 解包转换 75 5. 变量 77 5.1 变量类型 77 5.1.1 静态变量 77 5.1.2 实例变量 77 5.1.3 数组元素 78 5.1.4 数值参数 78 5.1.5 引用参数 78 5.1.6 输出参数 78 5.1.7 局部变量 79 5.2 默认值 79 5.3 明确赋值 79 5.3.1 初始赋值变量 81 5.3.2 非初始赋值变量 82 5.4 变量引用 82 6. 转换 83 6.1 隐式转换 83 6.1.1 同一性转换 83 6.1.2 隐式数值转换 83 6.1.3 隐式枚举转换 84 6.1.4 隐式引用转换 84 6.1.5 转换 84 6.1.6 隐式常数表达式转换 84 6.1.7 用户自定义隐式转换 85 6.2 显式转换 85 6.2.1 显式数值转换 85 6.2.2 显式枚举类型转换 86 6.2.3 显式引用类型转换 86 6.2.4 解包转换 87 6.2.5 用户自定义显式转换 87 6.3 标准转换 87 6.3.1 标准隐式转换 87 6.3.2 标准显式转换 88 6.4 用户定义转换 88 6.4.1 允许的用户自定义转换 88 6.4.2 用户自定义转换的取值 88 6.4.3 用户自定义隐式转换 89 6.4.4 用户自定义显式类型转换 89 7. 表达式 91 7.1 表达式分类 91 7.1.1 表达式的数值 92 7.2 操作符 92 7.2.1 操作符优先级和结合顺序 92 7.2.2 操作符重载 93 7.2.3 一元操作符重载分析 94 7.2.4 二元操作符重载分析 94 7.2.5 候选用户定义操作符 95 7.2.6 数字升级 95 7.3 成员查询 9
Java语言编码规范 1 介绍(INTRODUCTION) 3 1.1 为什么要有编码规范(WHY HAVE CODE CONVENTIONS) 3 1.2 版权声明(ACKNOWLEDGMENTS) 3 2 文件名(FILE NAMES) 4 2.1 文件后缀(FILE SUFFIXES) 4 2.2 常用文件名(COMMON FILE NAMES) 4 3 文件组织(FILE ORGANIZATION) 4 3.1 JAVA源文件(JAVA SOURCE FILES) 4 3.1.1 开头注释(Beginning Comments) 5 3.1.2 包和引入语句(Package and Import Statements) 5 3.1.3 类和接口声明(Class and Interface Declarations) 5 4 缩进排版(INDENTATION) 6 4.1 行长度(LINE LENGTH) 6 4.2 换行(WRAPPING LINES) 6 5 注释(COMMENTS) 8 5.1 实现注释的格式(IMPLEMENTATION COMMENT FORMATS) 9 5.1.1 块注释(Block Comments) 9 5.1.2 单行注释(Single-Line Comments) 10 5.1.3 尾端注释(Trailing Comments) 10 5.2 文档注释(DOCUMENTATION COMMENTS) 11 6 声明(DECLARATIONS) 12 6.1 每行声明变量的数量(NUMBER PER LINE) 12 6.2 初始化(INITIALIZATION) 12 6.3 布局(PLACEMENT) 12 6.4 类和接口的声明(CLASS AND INTERFACE DECLARATIONS) 13 7 语句(STATEMENTS) 14 7.1 简单语句(SIMPLE STATEMENTS) 14 7.2 复合语句(COMPOUND STATEMENTS) 14 7.3 返回语句(RETURN STATEMENTS) 14 7.4 IF,IF-ELSE,IF ELSE-IF ELSE语句(IF, IF-ELSE, IF ELSE-IF ELSE STATEMENTS) 15 7.5 FOR语句(FOR STATEMENTS) 15 7.6 WHILE语句(WHILE STATEMENTS) 16 7.7 DO-WHILE语句(DO-WHILE STATEMENTS) 16 7.8 SWITCH语句(SWITCH STATEMENTS) 16 7.9 TRY-CATCH语句(TRY-CATCH STATEMENTS) 17 8 空白(WHITE SPACE) 17 8.1 空行(BLANK LINES) 17 8.2 空格(BLANK SPACES) 18 9 命名规范(NAMING CONVENTIONS) 19 10 编程惯例(PROGRAMMING PRACTICES) 20 10.1 提供对实例以及类变量的访问控制(PROVIDING ACCESS TO INSTANCE AND CLASS VARIABLES) 20 10.2 引用类变量和类方法(REFERRING TO CLASS VARIABLES AND METHODS) 20 10.3 常量(CONSTANTS) 21 10.4 变量赋值(VARIABLE ASSIGNMENTS) 21 10.5 其它惯例(MISCELLANEOUS PRACTICES) 22 10.5.1 圆括号(Parentheses) 22 10.5.2 返回值(Returning Values) 22 10.5.3 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator) 23 10.5.4 特殊注释(Special Comments) 23 11 代码范例(CODE EXAMPLES) 23 11.1 JAVA源文件范例(JAVA SOURCE FILE EXAMPLE) 23
Go语言switch case语法可以用于根据不同的条件执行不同的代码块。与其他语言相比,Go语言switch case语法有以下几个特点: 1. 基本用法: ```go switch 变量 { case 值1: // 执行代码块1 case2: // 执行代码块2 default: // 执行默认代码块 } ``` 这是最基本的switch case语法,根据变量的值选择执行相应的代码块。 2. 一分支case多个并列值: ```go switch 变量 { case 值1, 值2, 值3: // 执行代码块 } ``` 可以在一个case语句中指定多个并列的值,如果变量的值与任何一个值匹配,就会执行相应的代码块。 3. interface{}接口的类型判断: ```go switch 变量.(type) { case 类型1: // 执行代码块1 case 类型2: // 执行代码块2 default: // 执行默认代码块 } ``` 可以使用switch case语句对接口类型进行类型判断,根据不同的类型执行相应的代码块。 4. 跨越case的fallthrough: ```go switch 变量 { case 值1: // 执行代码块1 fallthrough case 值2: // 执行代码块2 } ``` 使用fallthrough关键字可以使程序执行完一个case后继续执行下一个case的代码块。 5. 分支表达式: ```go switch { case 表达式1: // 执行代码块1 case 表达式2: // 执行代码块2 default: // 执行默认代码块 } ``` 可以在switch语句中省略变量,直接使用表达式进行判断。 这些是Go语言switch case语法的一些常见用法。根据不同的需求,可以灵活运用这些特性来编写逻辑清晰的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心码农1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值