zoukankan      html  css  js  c++  java
  • Golang reflect 反射

    反射的规则如下:  

    从接口值到反射对象的反射  
    从反射对象到接口值的反射  
    为了修改反射对象,其值必须可设置  

    ---------------------------------------------------------

    reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值。

    范例

    package main
     
    import (
        "fmt"
        "reflect"
    )
     
    type MyStruct struct {
        name string
    }
     
    func (this *MyStruct) GetName() string {
        return this.name
    }
     
    func main() {
        fmt.Println("--------------")
        var a MyStruct
        b := new(MyStruct)
        fmt.Println(reflect.ValueOf(a))
        fmt.Println(reflect.ValueOf(b))
     
        fmt.Println("--------------")
        a.name = "show"
        b.name = "show"
        val := reflect.ValueOf(a).FieldByName("name")
     
        //painc: val := reflect.ValueOf(b).FieldByName("name")
        fmt.Println(val)
     
        fmt.Println("--------------")
        fmt.Println(reflect.ValueOf(a).FieldByName("name").CanSet())
        fmt.Println(reflect.ValueOf(&(a.name)).Elem().CanSet())
     
        fmt.Println("--------------")
        var c string = "show"
        p := reflect.ValueOf(&c)
        fmt.Println(p.CanSet())        //false
        fmt.Println(p.Elem().CanSet()) //true
        p.Elem().SetString("newName")
        fmt.Println(c)
    }

    想更好的理解 go 的反射机制,可以从应用场景入手

    go语言reflect包使用的几个场景 

    1. 遍历结构体字段名(避免代码的硬编码)
    2. 调用结构体方法(自动映射)
    3. 获取结构体的tag标记的值(json/xml转换)

  • 相关阅读:
    解决:信息中插入avi格式的视频时,提示“unsupported video format”
    java字节数组和16进制之间的转换
    16进制转换字节数组工具类
    如何在ubuntu 12.04 中安装经典的 GNOME桌面
    Ubuntu安装软件提示”需要安装不能信任的软件包”解决办法
    Ubuntu系统下运行Eclipse出现找不到jre的问题的解决方法
    ubuntu添加共享出错
    从scrapy使用经历说开来
    有趣的问题--12 coins problem
    一个奇怪的MySQL错误返回
  • 原文地址:https://www.cnblogs.com/DaBing0806/p/6796064.html
Copyright © 2011-2022 走看看