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 相关文章推荐
golang 如何用反射reflect操作结构体
Apr 28 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang中异常处理机制详解
Jun 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
golang的文件创建及读写操作
Apr 14 Golang
Go获取两个时区的时间差
Apr 20 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 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警告错误信息的解决方法
2013/06/03 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
电脑教师的教学自我评价
2013/11/26 职场文书
先进集体获奖感言
2014/02/13 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
班委竞选演讲稿
2014/04/28 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS