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 Int转string几种方式性能测试
Apr 28 Golang
解决Go gorm踩过的坑
Apr 30 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
深入理解go slice结构
Sep 15 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go语言编译原理之变量捕获
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的计数器程序
2006/10/09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
php addslashes 函数详细分析说明
2009/06/23 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
小程序转发探索示例
2019/02/19 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
python格式化字符串实例总结
2014/09/28 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Python continue继续循环用法总结
2018/06/10 Python
Django中的文件的上传的几种方式
2018/07/23 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
创业计划书的写作技巧及要点
2014/01/31 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
优秀公益广告词大全
2014/03/19 职场文书
学校搬迁方案
2014/06/15 职场文书
初中教师个人工作总结
2015/02/10 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
使用Pytorch训练two-head网络的操作
2021/05/28 Python