From 340b00eb76135bb5323d9736906f4a19ea4a82f2 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 8 Aug 2023 13:35:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20reflects=20?= =?UTF-8?q?=E5=8C=85=EF=BC=8C=E5=8C=85=E5=90=AB=E5=8F=8D=E5=B0=84=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=BE=85=E5=8A=A9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/reflects/struct.go | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 utils/reflects/struct.go diff --git a/utils/reflects/struct.go b/utils/reflects/struct.go new file mode 100644 index 0000000..8777274 --- /dev/null +++ b/utils/reflects/struct.go @@ -0,0 +1,42 @@ +package reflects + +import ( + "fmt" + "reflect" + "unsafe" +) + +// DeepCopy 深拷贝 +func DeepCopy[T any](src T) T { + vof := reflect.Indirect(reflect.ValueOf(src)) + tof := vof.Type() + fmt.Println(tof) + + return src +} + +// GetPtrUnExportFiled 获取指针类型的未导出字段 +func GetPtrUnExportFiled(s reflect.Value, filedIndex int) reflect.Value { + v := s.Elem().Field(filedIndex) + return reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem() +} + +// SetPtrUnExportFiled 设置指针类型的未导出字段 +func SetPtrUnExportFiled(s reflect.Value, filedIndex int, val reflect.Value) { + v := GetPtrUnExportFiled(s, filedIndex) + v.Set(val) +} + +// Copy 拷贝 +func Copy(s reflect.Value) reflect.Value { + return reflect.NewAt(s.Type(), unsafe.Pointer(s.UnsafeAddr())).Elem() +} + +// GetPointer 获取指针 +func GetPointer[T any](src T) reflect.Value { + s := reflect.TypeOf(src) + if s.Kind() == reflect.Pointer { + return reflect.ValueOf(src) + } + return reflect.ValueOf(&src) +}