golang用type-switch判断interface的实际存储类型


Posted in Golang onApril 14, 2022

用type-switch判断interface的实际存储类型

在go语言中,interface很好用,但是往往我们无法确定interface里存储的到底是什么类型,而且go又是强类型语言。

type-switch就刚好帮我解决了这个问题

//例子
var s interface{}
switch s.(type) {
case string:
        fmt.println("这是一个string类型的变量")
case int64:
        fmt.println("这是一个你int64类型的变量")
default:
        fmt.println("以上类型都不是")
}
//另外如果只是单纯的想知道变量的类型,可以使用reflect.typeof()
val := "abcdefg123"
fmt.println(reflect.typeof(val))        //打印结果:string
beego.Debug(reflect.typeof(val))    //Debug打印结果:string

golang任何类型interface{}

golang中可以使用interface{}表示任何类型。

本文以例子的形式,演示interface{}的使用。

example1

package main
import (
        "fmt"
)
func main() {
        var t1 interface{} = 2
        v, ok := t1.(int)
        if ok {
                fmt.Println("int:", v)
        } else {
                fmt.Println("v:", v)
        }
}

output:

$ ./test
int: 2

判断interface的类型,如果是int型,就输出接口表示的值。

有时,如果确定知道类型T(例如int),会直接使用如下方式进行断言:

v := t1.(int)

但断言失败,会panic。可根据具体情况选择使用哪种方式。

example2

package main
import (
        "fmt"
)
func main() {
        var t1 interface{} = "abc"
        switch v := t1.(type) {
        case int:
                fmt.Println("int:", v)
        case string:
                fmt.Println("string:", v)
        default:
                fmt.Println("unknown type:", v)
        }
}

如果t1为abc:

output:

$ ./test
string: abc

如果t1为23:

output:

$ ./test
int: 23

如果t1为1.2

output:

$ ./test
unknown type: 1.2

Golang 相关文章推荐
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 Golang
golang语言指针操作
Apr 14 #Golang
golang使用map实现去除重复数组
Apr 14 #Golang
golang生成并解析JSON
Apr 14 #Golang
Go语言 详解net的tcp服务
Apr 14 #Golang
golang连接MySQl使用sqlx库
Apr 14 #Golang
Go语言安装并操作redis的go-redis库
Apr 14 #Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 #Golang
You might like
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
python构建自定义回调函数详解
2017/06/20 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
Python通过字典映射函数实现switch
2020/11/06 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
刑事代理授权委托书
2014/09/17 职场文书
大学生就业意向书
2015/05/11 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
消防演习感想
2015/08/10 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
MySQL读取JSON转换的方式
2022/03/18 MySQL