首页 > 其他分享 >go 反射 遍历对象属性 切片 Map

go 反射 遍历对象属性 切片 Map

时间:2024-10-18 22:00:33浏览次数:7  
标签:Map Kind 遍历 res list list2 reflect Person go

package main

import "fmt"
import "reflect"

func main() {
    p1 := Person{Name: "test1", Age: 20, Address: "1323"}
    p2 := Person{Name: "demo2", Age: 24, Address: "adsd"}
    var list []*Person
    list = append(list, &p1)
    list = append(list, &p2)

    var list2 []Person
    list2 = append(list2, p1)
    list2 = append(list2, p2)

    res := &ResponseData{ID: 1, Remark: "test", Data: list, List: list, List2: list2, Data2: list2, List3: []int64{1, 2, 3, 4}}

    res.Data4 = make(map[string]*Person)
    res.Data4[p1.Name] = &p1
    res.Data4[p2.Name] = &p2
    res.Data5 = make(map[int]Person)
    res.Data5[p1.Age] = p1
    res.Data5[p2.Age] = p2

    m := map[string]int{"test1": 1, "test2": 2}
    res.Data6 = m

    logResponse(res)
}

type Person struct {
    Name    string
    Age     int
    Address string
}

type ResponseData struct {
    ID     int         `json:"id"`
    Remark string      `json:"remark"`
    Data   []*Person   `json:"data"`
    List   interface{} `json:"list"`
    Data2  []Person    `json:"data2"`
    List2  interface{} `json:"list2"`
    List3  interface{} `json:"list3"`
    Data4  map[string]*Person
    Data5  map[int]Person
    Data6  map[string]int
}

func logResponse(obj interface{}) {

    defer func() {
        if e := recover(); e != nil {
            fmt.Printf("Panicing %s\r\n", e)
        }
    }()

    if obj == nil {
        return
    }

    t := reflect.TypeOf(obj)
    v := reflect.ValueOf(obj)

    k := v.Kind()
    if k == reflect.Ptr {
        v = v.Elem()
        t = v.Type()
        k = v.Kind()
    }

    if k != reflect.Struct {
        return
    }

    num := v.NumField()
    for i := 0; i < num; i++ {
        name := t.Field(i).Name
        f := v.Field(i)

        isSlice := false
        isMap := false
        if f.Kind() == reflect.Slice {
            isSlice = true
        } else if f.Kind() == reflect.Map {
            isMap = true
        } else if f.Kind() == reflect.Interface && f.CanInterface() {
            f = f.Elem()
            if f.Kind() == reflect.Slice {
                isSlice = true
            } else if f.Kind() == reflect.Map {
                isMap = true
            }
        }

        if isSlice {
            c := f.Len()
            for j := 0; j < c; j++ {
                vl := f.Index(j)
                if vl.Kind() == reflect.Ptr {
                    vl = vl.Elem()
                }

                if vl.Kind() == reflect.Struct {
                    fmt.Printf("%s[%d]=%+v \n", name, j, vl)
                } else {
                    fmt.Printf("%s %s = %v -tag:%s \n", name, t.Field(i).Type, f.Interface(), t.Field(i).Tag)
                    break
                }

            }
        } else if isMap {
            for _, key := range f.MapKeys() {
                val := f.MapIndex(key)
                if val.Kind() == reflect.Ptr {
                    val = val.Elem()
                }
                if val.Kind() == reflect.Struct {
                    fmt.Printf("%s[%v]=%+v \n", name, key.Interface(), val)
                } else {
                    fmt.Printf("%s %s = %v -tag:%s \n", name, t.Field(i).Type, f.Interface(), t.Field(i).Tag)
                    break
                }
            }
        } else {
            fmt.Printf("%s %s = %v -tag:%s \n", name, t.Field(i).Type, f.Interface(), t.Field(i).Tag)
        }
    }

}

go

标签:Map,Kind,遍历,res,list,list2,reflect,Person,go
From: https://www.cnblogs.com/majiang/p/18475133

相关文章

  • 图论之搜索遍历
    前言一个重要的板块,倒是有很多有趣的题,从搜索开始吧MazeTacToeS暴力即可,\(3^9\times25\times25\)绰绰有余,把状态转换为三进制\(dfs\)ConnectedComponents?根据鸽巢原理,必定有一个点被割去的边\(\le\frac{m}{n}\),然后我们找到这个点,对于连接他的边均在同一个联......
  • 解决mybatis用Map返回的字段全变大写的问题
    mybatis通常情况都是用javabean作为resultType的对象,但是有时也可以使用Map去接收。${value}如果使用Map,返回来的字段名全是大写,处理方法Selectnameas“name”fromv_zhyl_zxzf_hqyzflb加上字段别名加上双引号就可以了补充知识:Mybatis查询返回类型为Map空值字段不显示项目使......
  • 【shiro】11.shiro过滤器鉴权setFilterChainDefinitionMap
    之前学习shiro的时候,设置了登录页面和主页面(需要登录才能范围的页面。)1//配置系统公共资源2Map<String,String>map=newHashMap<>();3//authc请求这个资源需要认证和授权4map.put("/index","authc");5//默认认证界面路径6shiroFilterFactoryBean.setLoginUrl(l......
  • 一种很新的 map
    众所周知,map很慢,有时候会超时,所以我想到了这种比map快但又能实现map功能的map。因为unordered_map比map快很多,又能实现map的大多数功能,所以我们使用unordered_map代替map。但unordered_map是unordered的,所以在遍历时无法有序地输出,如下:for(unordered_map<in......
  • Mappest操作
    1publicstaticclassMappTest2{3publicstaticvoidRun()4{5varconfig=newTypeAdapterConfig();6//只要配置需要处理的类,并支持多个属性操作7config.ForType<MiddleClass,MiddleClass2>()8.Map(des......
  • 利用 PicGo 搭建基于 gitee 的个人图床,详细攻略!
    前言  大多数小伙伴写笔记都是用md格式了,为了更方便的去本地写博客以及笔记,准备自己通过gitee仓库搭建一个图床供自己使用,会让我们写笔记或博客更方便。运用图床工具可以方便地将图片上传到互联网,并获取图片的链接,这样可以在不同的平台上分享和使用这些图片。例如,在个人网站、社......
  • 博客-django--路由分发--找不到app的views--解决办法
    博客-django--路由分发--找不到app的views--解决办法bash先给出我的项目文件目录结构主要是主目录project与app01省略了migrations问题问题出现在路由分发中以下是主urls以下是app的urls解决方式需要使用相对路径.思考其实正常的话使用绝对路径也可以,如参考代码mysite2项目---目......
  • cargo deny 插件
    cargodeny2024-10-18插件Rust它专门用于帮助Rust开发者检查项目依赖项的安全性、许可证合规性、多版本依赖管理等.执行cargodenycheck启用检查.deny.toml文件基本配置:#关于advisories部分的更多文档可以在这里找到:#https://embarkstudios.github.io/cargo-d......
  • 【开题报告】基于django+vue汽车租赁系统设计与实现(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人们生活水平的提高,汽车租赁作为一种便捷、灵活的出行方式,逐渐受到广大消费者的青睐。传统的汽车租赁模式存在信息......
  • 毕业设计:python车牌识别系统 HyperLPR车牌识别(深度学习) 可视化 Django框架 大数据毕业
    python车牌识别系统HyperLPR车牌识别(深度学习)可视化Django框架✅1、项目介绍技术栈:Python语言、Django框架、MySQL数据库、HyperLPR库车牌识别(深度学习)、Echarts可视化系统功能:车牌号码识别,车牌所属省份,再给他搞个各省统计分析,柱状图,折线图这些、各省份地图、注......