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二维切片初始化的实现
Apr 08 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
golang正则之命名分组方式
Apr 25 Golang
Golang 正则匹配效率详解
Apr 25 Golang
golang 比较浮点数的大小方式
May 02 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Go timer如何调度
Jun 09 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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使用多个进程同时控制文件读写示例
2014/02/28 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
Javascript 入门基础学习
2010/03/10 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
javascript定时器完整实例
2015/02/10 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
详解Python中import机制
2020/09/11 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
几个数据库方面的面试题
2016/07/01 面试题
学校关爱留守儿童活动方案
2014/08/27 职场文书
人才市场接收函
2015/01/30 职场文书
工作失职检讨书范文
2015/05/05 职场文书
警示教育观后感
2015/06/17 职场文书
诚信高考倡议书
2019/06/24 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js