golang代码实例库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8560|回复: 0

golang:如何判断一个interface{}类型的数据具体是什么类型?

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
486
发表于 2021-12-6 23:23:09 | 显示全部楼层 |阅读模式
实例说明
如何判断一个interface{}类型的数据,具体是什么类型呢?判断类型的方式也有多种,那优缺点又是什么呢?
总结:

1)如果类型优先,并且强度速度,则我们使用GetDataType1
2)如果类型种类不确定,且对速度不敏感,则使用GetDataType2


实例代码
[Golang] 纯文本查看 复制代码
package main

import (
        "fmt"
        "reflect"
        "time"
)

// 测试结构对象
type MyStruct struct {
        Value string
}

// GetDataType1 获取data数据类型
// 缺点:这种方法只能试用于我们想确认的有限类型,即我们知道这个数据只能是几个固定类型中的一个,可以使用这种方式
// 优点:速度比反射reflect.TypeOf机制要快,快一个数量级
func GetDataType1(data interface{}) string {
        // .(type)只能在switch语句中使用
        switch data.(type) {
        case string:
                return "string"
        case int:
                return "int"
        case int32:
                return "int32"
        case int64:
                return "int64"
        case MyStruct: // 这里是一个自定义结构
                return "MyStruct"
        default:
                return "unknown"
        }
}

// GetDataType2 通过反射机制获取data数据类型
// 优点:这种方式比较通用
// 缺点:速度比switch x.(type)方式要慢
func GetDataType2(data interface{}) string {
        return reflect.TypeOf(data).String()
}

func main() {

        value := "我是一个字符串"

        t1 := GetDataType1(value)
        fmt.Println(t1)
        // 输出:string

        t2 := GetDataType2(value)
        fmt.Println(t2)
        // 输出:string

        sValue := MyStruct{"china"}
        t3 := GetDataType1(sValue)
        fmt.Println(t3)
        // 输出:MyStruct

        t4 := GetDataType2(sValue)
        fmt.Println(t4)
        // 输出:main.MyStruct

        ///////////////////////////////////////////////////////
        // 性能对比,运行多次,输出差不多,均是反射慢一个数量级左右
        curTime := time.Now()
        for i := 0; i <= 10000; i++ {
                t3 = GetDataType1(sValue)
        }
        fmt.Println(time.Since(curTime))
        // 输出:30.363µs

        curTime = time.Now()
        for i := 0; i <= 10000; i++ {
                t3 = GetDataType2(sValue)
        }
        fmt.Println(time.Since(curTime))
        // 输出:562.862µs
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|golang代码实例库 ( 粤ICP备2021162396号 )

GMT+8, 2025-7-13 09:23 , Processed in 0.018187 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表