golang获取变量或对象类型的几种方式总结

 更新时间:2022年12月26日 10:00:24   作者:Byte-Coder  
在golang中并没有提供内置函数来获取变量的类型,但是通过一定的方式也可以获取,下面这篇文章主要给大家介绍了关于golang获取变量或对象类型的几种方式,需要的朋友可以参考下

fmt.Printf("%T")方式

示例:

var1 := "hello world"
fmt.Printf("var1 = %T\n", var1)

这个是最简单,也是最推荐的在at rumtime时获取变量类型的方式,

用fmt.Printf("%T")实现返回变量类型的函数

由此衍生出可复用获取变量或者对象type的函数,如下面函数,直接返回变量类型

func typeofVariable(variable interface{}) string {
   return fmt.Sprintf("%T", variable)
}

 reflect.TypeOf方式

示例:

var1 := "hello world"
fmt.Printf("var1: %s\n", reflect.TypeOf(var1))

用  reflect包里的函数 TypeOf()来实现,用起来相对来说复杂些,如果只是单纯地想在runtime时获取一下变量类型,还是推荐第一种方式

用reflect.TypeOf实现返回变量类型的函数

由此衍生出可复用获取变量或对象type的函数,如下面函数,直接返回变量类型

func typeofVariable(variable interface{}) string {
    return reflect.TypeOf(variable).String()
}

reflect.ValueOf.Kind()方式

示例:

var1 := "hello world"
fmt.Println(reflect.ValueOf(var1).Kind())

用 reflect.ValueOf.Kind()实现返回变量类型的函数

func typeofVariable(variable interface{}) string {
        return reflect.ValueOf(variable).Kind().String()
}

断言方式

func typeofObject(variable interface{}) string {
        switch variable.(type) {
        case string:
                return "string"
        case int:
                return "int"
        case float32:
                return "float32"
        case float64:
                return "float64"
        case bool:
                return "boolean"
        case []string:
                return "[]string"
        case complex128:
                return "complex128"
        case complex64:
                return "complex64"
        case map[string]float64:
                return "map"
        case Employee:
                return "Employee"
        default:
                return "unknown"
        }
}

代码示例:

package main
 
import (
    "fmt"
    "reflect"
)
 
 
type Employee struct {
    name string
    age  int
    salary float64
}
 
 
// 4 ways to return a variable's type at runtime
 
func typeofObject(variable interface{}) string {
        switch variable.(type) {
        case string:
                return "string"
        case int:
                return "int"
        case float32:
                return "float32"
        case float64:
                return "float64"
        case bool:
                return "boolean"
        case []string:
                return "[]string"
        case complex128:
                return "complex128"
        case complex64:
                return "complex64"
        case map[string]float64:
                return "map"
        case Employee:
                return "Employee"
        default:
                return "unknown"
        }
}
 
func main() {
 
    var1 := "hello world"
    var2 := 10
    var3 := 2.55
    var4 := []string{"BeiJing", "ShangHai", "ShenZhen"}
    var5 := map[string]float64{"BeiJing": 3.2, "ShaiHai": 1.2}
    var6 := complex(3,4)
    var7 := true
    var8 := Employee{"Sam",30,15000.5}
 
    fmt.Println("###############    Using %T with Printf    ########################")
 
    fmt.Printf("var1 = %T\n", var1)
    fmt.Printf("var2 = %T\n", var2)
    fmt.Printf("var3 = %T\n", var3)
    fmt.Printf("var4 = %T\n", var4)
    fmt.Printf("var5 = %T\n", var5)
    fmt.Printf("var6 = %T\n", var6)
    fmt.Printf("var7 = %T\n", var7)
    fmt.Printf("var8 = %T\n", var8)
 
 
    fmt.Println("###############Using reflect.TypeOf Function #######################")
    fmt.Printf("var1: %s\n", reflect.TypeOf(var1))
    fmt.Printf("var2: %s\n", reflect.TypeOf(var2))
    fmt.Printf("var3: %s\n", reflect.TypeOf(var3))
    fmt.Printf("var4: %s\n", reflect.TypeOf(var4))
    fmt.Printf("var5: %s\n", reflect.TypeOf(var5))
    fmt.Printf("var6: %s\n", reflect.TypeOf(var6))
    fmt.Printf("var7: %s\n", reflect.TypeOf(var7))
    fmt.Printf("var8: %s\n", reflect.TypeOf(var8))
 
 
    fmt.Println("###############Using reflect.ValueOf.Kind() ########################")
    fmt.Println(reflect.ValueOf(var1).Kind())
    fmt.Println(reflect.ValueOf(var2).Kind())
    fmt.Println(reflect.ValueOf(var3).Kind())
    fmt.Println(reflect.ValueOf(var4).Kind())
    fmt.Println(reflect.ValueOf(var5).Kind())
    fmt.Println(reflect.ValueOf(var6).Kind())
    fmt.Println(reflect.ValueOf(var7).Kind())
    fmt.Println(reflect.ValueOf(var8).Kind())
 
 fmt.Println("################## Using Type assertions ###########################")
    fmt.Println(typeofObject(var1))
    fmt.Println(typeofObject(var2))
    fmt.Println(typeofObject(var3))
    fmt.Println(typeofObject(var4))
    fmt.Println(typeofObject(var5))
    fmt.Println(typeofObject(var6))
    fmt.Println(typeofObject(var7))
    fmt.Println(typeofObject(var8))
 
 
}
 
/*
几个复用的函数来判断变量的类型at runtime
// Using %T
func typeofVariable(variable interface{}) string {
   return fmt.Sprintf("%T", variable)
}
// Using reflect.TypeOf()
func typeofVariable(variable interface{}) string {
    return reflect.TypeOf(variable).String()
}
// Using reflect.ValueOf().Kind()
func typeofVariable(variable interface{}) string {
        return reflect.ValueOf(variable).Kind().String()
}
*/

结果演示:

总结

到此这篇关于golang获取变量或对象类型的几种方式总结的文章就介绍到这了,更多相关golang获取变量或对象类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • goland 导入github包报红问题解决

    goland 导入github包报红问题解决

    本文主要介绍了Go项目在GoLand中导入依赖标红问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • 详解Go语言中单链表的使用

    详解Go语言中单链表的使用

    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。本文将通过实例为大家详解Go语言中单链表的常见用法,感兴趣的可以了解一下
    2022-08-08
  • golang 熔断器的实现过程

    golang 熔断器的实现过程

    这篇文章主要介绍了golang 熔断器的实现过程,Go 项目中使用熔断技术提高系统容错性。接下俩就来给打家介绍 go 熔断器和其使用,需要的朋友可以参考一下
    2022-01-01
  • golang协程与线程区别简要介绍

    golang协程与线程区别简要介绍

    这篇文章主要介绍了golang协程与线程区别简要介绍,进程是操作系统资源分配的基本单位,是程序运行的实例,线程是操作系统调度到CPU中执行的基本单位
    2022-06-06
  • Golang cron 定时器和定时任务的使用场景

    Golang cron 定时器和定时任务的使用场景

    Ticker是一个周期触发定时的计时器,它会按照一个时间间隔往channel发送系统当前时间,而channel的接收者可以以固定的时间间隔从channel中读取事件,这篇文章主要介绍了Golang cron 定时器和定时任务,需要的朋友可以参考下
    2022-09-09
  • Go语言使用组合的思想实现继承

    Go语言使用组合的思想实现继承

    这篇文章主要为大家详细介绍了在 Go 里面如何使用组合的思想实现“继承”,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以了解一下
    2022-12-12
  • go语言通过zlib压缩数据的方法

    go语言通过zlib压缩数据的方法

    这篇文章主要介绍了go语言通过zlib压缩数据的方法,实例分析了Go语言中zlib的使用技巧,需要的朋友可以参考下
    2015-03-03
  • 浅谈goland导入自定义包时出错(一招解决问题)

    浅谈goland导入自定义包时出错(一招解决问题)

    这篇文章主要介绍了浅谈goland导入自定义包时出错(一招解决问题),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言使用HTTP包创建WEB服务器的方法

    Go语言使用HTTP包创建WEB服务器的方法

    这篇文章主要介绍了Go语言使用HTTP包创建WEB服务器的方法,结合实例形式分析了Go语言基于HTTP包创建WEB服务器客户端与服务器端的实现方法与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • Go+Lua解决Redis秒杀中库存与超卖问题

    Go+Lua解决Redis秒杀中库存与超卖问题

    本文主要介绍了Go+Lua解决Redis秒杀中库存与超卖问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论