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语言中的UTF-8实现
Apr 26 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang import自定义包方式
Apr 29 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Golang二维数组的使用方式
May 28 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
Go并发4种方法简明讲解
Apr 06 Golang
golang定时器
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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
php调用mysql数据 dbclass类
2011/05/07 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
使用Python写个小监控
2016/01/27 Python
python实现俄罗斯方块
2018/06/26 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python实现名片管理器的示例代码
2019/12/17 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
美国批发供应商:Kole Imports
2019/04/10 全球购物
初中校园之声广播稿
2014/01/15 职场文书
财务负责人岗位职责
2015/02/03 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
迎新生晚会主持词
2015/06/30 职场文书
Python Parser的用法
2021/05/12 Python
如何在python中实现ECDSA你知道吗
2021/11/23 Python
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript