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 interface判断为空nil的实现代码
Apr 24 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
golang switch语句的灵活写法介绍
May 06 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang定时器
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言入门exec的基本使用
May 20 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
python实现的简单文本类游戏实例
2015/04/28 Python
Python星号*与**用法分析
2018/02/02 Python
python 如何停止一个死循环的线程
2020/11/24 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
中学生自我鉴定
2014/02/04 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
网站客服岗位职责
2014/04/05 职场文书
作风建设剖析材料
2014/10/06 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
邀请函范文
2015/02/02 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python