github.com/golang-infrastructure/go-reflect-utils@v0.0.0-20221130143747-965ef2eb09c3/struct.go (about)

     1  package reflect_utils
     2  
     3  //
     4  //import (
     5  //	"fmt"
     6  //	"reflect"
     7  //	"unsafe"
     8  //)
     9  //
    10  //// GetStructPtrUnExportedField 获取struct上给定字段的值
    11  //func GetStructPtrUnExportedField(source any, fieldName string) reflect.ItemValue {
    12  //	v := reflect.ValueOf(source).Elem().FieldByName(fieldName)
    13  //	if !v.IsValid() {
    14  //		return v
    15  //	}
    16  //	return reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem()
    17  //}
    18  //
    19  //// SetStructPtrUnExportedStrField 设置struct上给定字段的值
    20  //func SetStructPtrUnExportedStrField(source interface{}, fieldName string, fieldVal interface{}) error {
    21  //	v := GetStructPtrUnExportedField(source, fieldName)
    22  //	rv := reflect.ValueOf(fieldVal)
    23  //	if v.Kind() != rv.Kind() {
    24  //		return fmt.Errorf("invalid kind: expected kind %v, got kind: %v", v.Kind(), rv.Kind())
    25  //	}
    26  //	v.Set(rv)
    27  //	return nil
    28  //}
    29  //
    30  //// Merge 合并Struct
    31  //func Merge(sourceStruct, destStruct any) error {
    32  //	// TODO 2022-10-16 10:42:55
    33  //
    34  //	return nil
    35  //}
    36  
    37  //// StructToMap 把struct转为map类型,如果struct的field也是struct的话,会递归转换
    38  //func StructToMap(value any) map[string]any {
    39  //}
    40  
    41  //func MapToStruct() {
    42  //
    43  //}
    44  //
    45  //// StructFieldNames 获取一个struct的所有字段名
    46  //func StructFieldNames() {
    47  //
    48  //}
    49  //
    50  //// StructValues 获取一个struct的所有字段值
    51  //func StructValues() {
    52  //
    53  //}
    54  //
    55  //// IsStruct 判断是否是struct,如果是指针的话就递归访问拿到真实的值
    56  //func IsStruct() bool {
    57  //
    58  //}
    59  
    60  // ------------------------------------------------- ------------------------------------------------------------------------
    61  
    62  //func StructToBytes(structObject *any) []byte {
    63  //	s := unsafe.Pointer(structObject)
    64  //	sizeOfMyStruct := int(unsafe.Sizeof(structObject))
    65  //
    66  //	var x reflect.SliceHeader
    67  //	x.Len = sizeOfMyStruct
    68  //	x.Cap = sizeOfMyStruct
    69  //	x.Data = uintptr(s)
    70  //	return *(*[]byte)(unsafe.Pointer(&x))
    71  //}
    72  //
    73  //func BytesToStruct() {
    74  //
    75  //}