admin 发表于 2021-12-6 23:23:09

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

■实例说明
如何判断一个interface{}类型的数据,具体是什么类型呢?判断类型的方式也有多种,那优缺点又是什么呢?
总结:
1)如果类型优先,并且强度速度,则我们使用GetDataType1
2)如果类型种类不确定,且对速度不敏感,则使用GetDataType2


■实例代码
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
}



页: [1]
查看完整版本: golang:如何判断一个interface{}类型的数据具体是什么类型?