• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go语言中反射的正确使用

    介绍

    反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。

    反射有两个问题,在使用前需要三思:

    1. 大量的使用反射会损失一定性能
    2. Clear is better than clever. Reflection is never clear.

    Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质:

    1. 变量包括 type, value> 两部分。理解这一点你就知道为什么nil != nil了。
    2. type包括 static typeconcrete type. 简单来说 static type是你在编码是看见的类型,concrete type是runtime系统看见的类型。
    3. 类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.
    4. Go中的反射依靠interface{}作为桥梁,因此遵循原则3. 例如,反射包.Kind方法返回的是concrete type, 而不是static type.

    多说无用,下面来看示例代码

    复制代码 代码如下:

    package main
     
    import (
        "fmt"
        "reflect"
    )
     
    type T struct {
        A int
        B string
    }
     
    func main() {
        t := T{23, "skidoo"}
        tt := reflect.TypeOf(t)
        fmt.Printf("t type:%v\n", tt)
        ttp := reflect.TypeOf(t)
        fmt.Printf("t type:%v\n", ttp)
        // 要设置t的值,需要传入t的地址,而不是t的拷贝。
        // reflect.ValueOf(t)只是一个地址的值,不是settable, 通过.Elem()解引用获取t本身的reflect.Value
        s := reflect.ValueOf(t).Elem()
        typeOfT := s.Type()
        for i := 0; i s.NumField(); i++ {
            f := s.Field(i)
            fmt.Printf("%d: %s %s = %v\n", i,
                typeOfT.Field(i).Name, f.Type(), f.Interface())
        }
    }
     
    // 输出结果
    // t type:main.T
    // t type:*main.T
    // 0: A int = 23
    // 1: B string = skidoo

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

    您可能感兴趣的文章:
    • golang之反射和断言的具体使用
    • 详解Golang利用反射reflect动态调用方法
    • 浅谈Go语言中的结构体struct & 接口Interface & 反射
    • Go语言学习笔记之反射用法详解
    • 谈谈Go语言的反射三定律
    • go语言通过反射获取和设置结构体字段值的方法
    • Go语言中使用反射的方法
    • 图文详解go语言反射实现原理
    上一篇:Go语言WaitGroup使用时需要注意的坑
    下一篇:Go语言中使用gorm小结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go语言中反射的正确使用 语,言中,反射,的,正确,使用,