feat(reflect tool):创建反射工程,提供四个基础反射方法
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* @Author : huangzj
|
||||||
|
* @Time : 2020/4/24 14:51
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"GoReflectTool/util"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
testReflect()
|
||||||
|
}
|
||||||
|
|
||||||
|
func testReflect() {
|
||||||
|
entity := Entity{
|
||||||
|
Num: 1,
|
||||||
|
S: "1223",
|
||||||
|
T: make(map[string]string),
|
||||||
|
}
|
||||||
|
structMap := util.GetStructFieldTypeMap(entity)
|
||||||
|
fmt.Println("根据结构体获取Map结构")
|
||||||
|
for key, val := range structMap {
|
||||||
|
fmt.Println(fmt.Sprintf("结构体属性,key: %v ,value: %v ", key, val))
|
||||||
|
}
|
||||||
|
|
||||||
|
strMap := util.GetPtrFieldTypeMap(&entity)
|
||||||
|
fmt.Println("根据结构体的指针对象获取Map结构")
|
||||||
|
for key, val := range strMap {
|
||||||
|
fmt.Println(fmt.Sprintf("结构体属性,key: %v ,value: %v ", key, val))
|
||||||
|
}
|
||||||
|
|
||||||
|
ptrList := util.GetPtrTypeFieldNameList(reflect.TypeOf(&entity))
|
||||||
|
fmt.Println("根据结构体指针类型获取对应的属性名")
|
||||||
|
for _, val := range ptrList {
|
||||||
|
fmt.Println(fmt.Sprintf("字段名:%s ", val))
|
||||||
|
}
|
||||||
|
|
||||||
|
structList := util.GetStructTypeFieldNameList(reflect.TypeOf(entity))
|
||||||
|
fmt.Println("根据结构体类型获取对应所有字段名称")
|
||||||
|
for _, val := range structList {
|
||||||
|
fmt.Println(fmt.Sprintf("字段名:%s ", val))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Entity struct {
|
||||||
|
Num int
|
||||||
|
S string
|
||||||
|
T map[string]string
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# 作用
|
||||||
|
本工程仅供个人学习记录,刚开始学习go(之前是java),本工程积累一些反射的用法。后期查询更加快捷
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 更新日志
|
||||||
|
2020/4/24 :创建FiledValueTool.go四个方法,分别处理【结构体对象】、【结构体指针对象】的字段名-字段值的map获取以及 【结构体类型】、【结构体指针类型】的字段名获取
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* @Author : huangzj
|
||||||
|
* @Time : 2020/4/24 12:00
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
|
||||||
|
package util
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 方法仅支持【结构体对象】
|
||||||
|
*
|
||||||
|
* @param 结构体对象
|
||||||
|
* @return 字段名和字段值对应的map
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
func GetStructFieldTypeMap(i interface{}) map[string]interface{} {
|
||||||
|
//应该在最前面这边有一个判断才对
|
||||||
|
if GetValueType(i) != reflect.Struct {
|
||||||
|
panic("该方法只支持结构体对象")
|
||||||
|
}
|
||||||
|
|
||||||
|
var m map[string]interface{}
|
||||||
|
m = make(map[string]interface{})
|
||||||
|
|
||||||
|
t := reflect.TypeOf(i)
|
||||||
|
v := reflect.ValueOf(i)
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
fn := t.Field(i).Name
|
||||||
|
val := v.Field(i).Interface()
|
||||||
|
m[fn] = val
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 方法仅支持【结构体的指针对象】
|
||||||
|
*
|
||||||
|
* @param 结构体的指针对象
|
||||||
|
* @return 字段名和字段值对应的map
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
func GetPtrFieldTypeMap(i interface{}) map[string]interface{} {
|
||||||
|
|
||||||
|
var m map[string]interface{}
|
||||||
|
m = make(map[string]interface{})
|
||||||
|
|
||||||
|
ind := reflect.Indirect(reflect.ValueOf(i))
|
||||||
|
t := ind.Type()
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
fn := t.Field(i).Name
|
||||||
|
val := ind.Field(i).Interface()
|
||||||
|
m[fn] = val
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 根据结构体类型获取结构体字段的名称数组
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* @return
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
func GetStructTypeFieldNameList(t reflect.Type) []string {
|
||||||
|
list := make([]string, 0)
|
||||||
|
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
list = append(list, t.Field(i).Name)
|
||||||
|
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 根据结构体类型的指针获取结构体字段的名称数组
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* @return
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
func GetPtrTypeFieldNameList(t reflect.Type) []string {
|
||||||
|
list := make([]string, 0)
|
||||||
|
|
||||||
|
typ := t.Elem()
|
||||||
|
|
||||||
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
list = append(list, typ.Field(i).Name)
|
||||||
|
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @description 判断传进来的参数是什么类型的
|
||||||
|
*/
|
||||||
|
func GetValueType(value interface{}) reflect.Kind {
|
||||||
|
return reflect.TypeOf(value).Kind()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user