From 5d9b7282abed4d95be01483c72e981c7c70d25f5 Mon Sep 17 00:00:00 2001 From: Huangzj Date: Mon, 4 Jan 2021 15:49:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(Go-Tool)=EF=BC=9A=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=202021/1/4=20=EF=BC=9AreflectM=E5=8C=85?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0indirect=E5=A4=84=E7=90=86=E6=8C=87=E9=92=88?= =?UTF-8?q?=E5=92=8C=E9=9D=9E=E6=8C=87=E9=92=88=EF=BC=8C=E8=8E=B7=E5=8F=96?= =?UTF-8?q?type=E3=80=81value?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 ++ util/reflectM/Indirect.go | 25 +++++++++++++++ util/reflectM/Indirect_test.go | 58 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 util/reflectM/Indirect.go create mode 100644 util/reflectM/Indirect_test.go diff --git a/readme.md b/readme.md index e549450..bc827ac 100644 --- a/readme.md +++ b/readme.md @@ -77,6 +77,8 @@ 2020/12/31:删除源码学习部分,挪到Go-Study工程 +2021/1/4 :reflectM包添加indirect处理指针和非指针,获取type、value + # mod vendor模式加载包 通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到 diff --git a/util/reflectM/Indirect.go b/util/reflectM/Indirect.go new file mode 100644 index 0000000..639f032 --- /dev/null +++ b/util/reflectM/Indirect.go @@ -0,0 +1,25 @@ +/* + * @Author : huangzj + * @Time : 2021/1/4 15:44 + * @Description: + */ + +package reflectM + +import "reflect" + +//获取value值,包含ptr的处理 +func Indirect(reflectValue reflect.Value) reflect.Value { + for reflectValue.Kind() == reflect.Ptr { + reflectValue = reflectValue.Elem() + } + return reflectValue +} + +//获取Type值,包含ptr的处理 +func IndirectType(reflectType reflect.Type) reflect.Type { + for reflectType.Kind() == reflect.Ptr || reflectType.Kind() == reflect.Slice { + reflectType = reflectType.Elem() + } + return reflectType +} diff --git a/util/reflectM/Indirect_test.go b/util/reflectM/Indirect_test.go new file mode 100644 index 0000000..b99e3e0 --- /dev/null +++ b/util/reflectM/Indirect_test.go @@ -0,0 +1,58 @@ +/* + * @Author : huangzj + * @Time : 2021/1/4 15:46 + * @Description: + */ + +package reflectM + +import ( + "fmt" + "reflect" + "testing" +) + +type Test struct { + testA int + testB string +} + +func TestIndirect(t *testing.T) { + i := 20 + s := "测试" + fmt.Println("测试type") + test := Test{ + testA: 10000, + testB: "我是测试属性", + } + + fmt.Println(IndirectType(reflect.TypeOf(i))) + fmt.Println(IndirectType(reflect.TypeOf(s))) + fmt.Println(IndirectType(reflect.TypeOf(test))) + fmt.Println(IndirectType(reflect.TypeOf(&test))) + fmt.Println(IndirectType(reflect.TypeOf([]Test{test}))) + fmt.Println(IndirectType(reflect.TypeOf([]*Test{&test, &test, &test}))) + fmt.Println(IndirectType(reflect.TypeOf(map[string]Test{ + "a": test, + }))) + fmt.Println(IndirectType(reflect.TypeOf(map[string]*Test{ + "a": &test, + }))) + + fmt.Println("测试value") + fmt.Println() + fmt.Println() + + fmt.Println(Indirect(reflect.ValueOf(i))) + fmt.Println(Indirect(reflect.ValueOf(s))) + fmt.Println(Indirect(reflect.ValueOf(test))) + fmt.Println(Indirect(reflect.ValueOf(&test))) + fmt.Println(Indirect(reflect.ValueOf([]Test{test}))) + fmt.Println(Indirect(reflect.ValueOf([]*Test{&test}))) + fmt.Println(Indirect(reflect.ValueOf(map[string]Test{ + "a": test, + }))) + fmt.Println(Indirect(reflect.ValueOf(map[string]*Test{ + "a": &test, + }))) +}