zoukankan      html  css  js  c++  java
  • golang 反射和利用反射取结构体值

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type Reflect struct {
        Name string `json:"name" test:"tag"`
        PassWord string
        Three int
    
    }
    
    func (m Reflect)Hello(v int)  {
        fmt.Println("hello",v)
    }
    
    func (m Reflect)World()  {
        fmt.Printf("world")
    }
    
    func main()  {
        //st:=reflect.DeepEqual()
        s:=Reflect{"name","password",0}
        //类型
        ty:=reflect.TypeOf(s)
        //
        va:=reflect.ValueOf(s)
    
        //kind判断类型
        if ty.Kind()!=reflect.Struct{
            fmt.Println("error not struct")
        }
        //type 相关的操作
        //结构体名字
        fmt.Println(ty.Name())
        //字段数
        fmt.Println(ty.NumField())
    
        for i:=0;i<ty.NumField();i++{
    
            //获取字段具体的值
            value:=va.Field(i).Interface()
    
            //获取单个字段
            filed:=ty.Field(i)
    
            //filed.Tag可以获取tag,通过tag进行参数的校验
            fmt.Printf("第%d 个字段是%s,%s ,值为%v 
    ",i,filed.Name,filed.Type,value)
    
            //打印后面的tag标签
            fmt.Println(filed.Tag)
        }
    
        //获取方法相关
        fmt.Println(ty.NumMethod())
        for i:=0;i<ty.NumMethod();i++{
            //方法名字和类型
            method:=ty.Method(i)
            fmt.Printf("方法名:%s 类型:%v
    ",method.Name,method.Type)
        }
    
    
    
        //通过反射修改内容,必须取出地址
        add:=&Reflect{"name","password",0}
    
    
        v:=reflect.ValueOf(add)
        // 修改值必须是指针类型否则不可行
        if v.Kind() != reflect.Ptr {
            fmt.Println("不是指针类型,没法进行修改操作")
            return
        }
    
        //获取指针
        ptr:=v.Elem()
    
        //获取具体字段的封装
        name:=ptr.FieldByName("Name")
        if name.Kind()!=reflect.String{
            fmt.Printf("类型出错 
    ")
            return
        }
    
        //修改具体的值
        name.SetString("change")
        fmt.Println(add.Name)
    
        //简单的修改整形
        ret:=999
        addr:=reflect.ValueOf(&ret)
        addr.Elem().SetInt(123)
        fmt.Println(ret)
    
    
    
    
        //通过反射调用方法
    
        //有参方法
        v1:=reflect.ValueOf(s)
    
        method1:=v1.MethodByName("Hello")
        arg:=[]reflect.Value{reflect.ValueOf(1)}
        method1.Call(arg)
    
    
        //调用无参数方法
        method2:=v1.MethodByName("World")
        var arg2 []reflect.Value
        method2.Call(arg2)
    
    }

    简单的反射操作

    利用反射取出需要的结构体值

    import (
    "fmt"
    "reflect"
    "strings"
    )

    type T struct { A1 string A2 string B1 string A3 string A4 int } func main() { data := make([]string, 0) t := &T{"A11111", "A222222","B12212", "",1} object := reflect.ValueOf(t) ref := object.Elem() //类型 ty:=ref.Type() for i := 0; i < ref.NumField(); i++ { //获取值 field := ref.Field(i) //不是string类型跳过 if field.Kind()!=reflect.String{ continue } //只要包含"A"的 if strings.Contains(ty.Field(i).Name,"A")&&field.String()!=""{ data = append(data, field.String()) } } fmt.Println(data) }
  • 相关阅读:
    iOS发展 ---- 至iPhone 6自适应布局设计 Auto Layout
    云大数据实战记录-大数据推荐
    android 在特殊应用的特殊功能,以帮助通信系统的问题
    十四.200创业课程获得百万--不良,不要启动
    JSP路径出现故障
    Burp Suite抓包、截包和改包
    [Linux]Centos git报错fatal: HTTP request failed
    数据库名和实例
    SSDTHook实例--编写稳定的Hook过滤函数
    (7)基于hadoop的简单网盘应用实现3
  • 原文地址:https://www.cnblogs.com/9527s/p/14237398.html
Copyright © 2011-2022 走看看