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判断key是否在map中的代码
Apr 24 Golang
golang中的空slice案例
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言基础知识点介绍
Jul 04 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 实现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根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php单例模式示例分享
2015/02/12 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
wxPython实现文本框基础组件
2019/11/18 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
Python如何实现单例模式
2016/06/03 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
环境工程毕业生自荐信
2013/11/17 职场文书
银行职员思想汇报
2013/12/31 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
2015年城市管理工作总结
2015/05/23 职场文书