zoukankan      html  css  js  c++  java
  • go反射获取struct实例对应的struct的方法个数,字段,并调用方法

    用Go语言 遍历结构体的字段和调方法 (反射最佳实践) (Golang经典编程案例)
    原创cui_yonghua 最后发布于2019-07-08 17:59:52 阅读数 1633 收藏
    展开
    案例:使用反射来遍历结构体的字段,调用结构体的方法,并获取结构体标签的值

    package main

    import (
    "fmt"
    "reflect"
    )
    //定义Monster结构体
    type Monster struct {
    Name string `json:"name"`
    Age int `json:"monster_age"`
    Score float32 `json:"成绩"`
    Sex string
    }
    //方法,返回两个数的和
    func (s Monster) GetSum(n1, n2 int) int {
    return n1 + n2
    }
    //方法,接受4个值,给s赋值
    func (s Monster) Set(name string,age int,score float32,sex string) {
    s.Name = name
    s.Age = age
    s.Score = score
    s.Sex = sex
    }
    //方法,显示s的值
    func (s Monster) Print() {
    fmt.Println("----start----")
    fmt.Println(s)
    fmt.Println("----end----")
    }
    func TestStruct(a interface{}) {

    typ := reflect.TypeOf(a)
    val := reflect.ValueOf(a) //获取reflect.Type类型

    kd := val.Kind() //获取到a对应的类别
    if kd != reflect.Struct {
    fmt.Println("expect struct")
    return
    }
    //获取到该结构体有几个字段
    num := val.NumField()
    fmt.Printf("该结构体有%d个字段 ", num) //4个

    //遍历结构体的所有字段
    for i := 0; i < num; i++ {
    fmt.Printf("Field %d:值=%v ",i,val.Field(i))
    //获取到struct标签,需要通过reflect.Type来获取tag标签的值
    tagVal := typ.Field(i).Tag.Get("json")
    //如果该字段有tag标签就显示,否则就不显示
    if tagVal != ""{
    fmt.Printf("Field %d:tag=%v ",i,tagVal)
    }
    }
    //获取到该结构体有多少个方法
    numOfMethod := val.NumMethod()
    fmt.Printf("struct has %d methods ",numOfMethod)

    //方法的排序默认是按照函数名的顺序(ASCII码)
    val.Method(1).Call(nil) //获取到第二个方法,调用它

    //调用结构体的第1个方法,Method(0)
    var params []reflect.Value
    params = append(params,reflect.ValueOf(10))
    params = append(params,reflect.ValueOf(40))
    //传入的参数是 []reflect.Value,返回 []reflect.Value
    res := val.Method(0).Call(params)
    //返回结果,返回的结果是 []reflect.Value
    fmt.Println("返回的结果 res=",res[0].Int())

    }

    func main() {
    //创建一个Monster实例
    var a Monster = Monster{
    Name:"张三丰",
    Age:99,
    Score:80.5,
    }
    //将Monster实例传递给TestStruct函数
    TestStruct(a)
    }
    ————————————————
    版权声明:本文为CSDN博主「cui_yonghua」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/cui_yonghua/article/details/95079778

  • 相关阅读:
    利用反射技术修改类中的字段(成员变量的反射)
    Java长存!12个Java长久占居主要地位的原因
    撰写架构设计文档的心得体会
    做个正能量的程序员
    程序员如何提高自己的编程水平
    mysql查询优化
    MySQL修改最大连接数,没有my.ini文件,只有my-default,这怎么改呀?
    PDO 拿出來的 Float 數據跟数据库中的数据不匹配
    大量多级分类数据的获取、缓存、搜索查询 怎么设计最快 ?
    windows下MySQL5.6以上版本,如何通过修改配置文件来修改数据库的最大连接数啊?
  • 原文地址:https://www.cnblogs.com/oxspirt/p/12381389.html
Copyright © 2011-2022 走看看