github.com/modern-go/refLect2@v1.0.1/safe_field.go (about)

     1  package reflect2
     2  
     3  import (
     4  	"reflect"
     5  	"unsafe"
     6  )
     7  
     8  type safeField struct {
     9  	reflect.StructField
    10  }
    11  
    12  func (field *safeField) Offset() uintptr {
    13  	return field.StructField.Offset
    14  }
    15  
    16  func (field *safeField) Name() string {
    17  	return field.StructField.Name
    18  }
    19  
    20  func (field *safeField) PkgPath() string {
    21  	return field.StructField.PkgPath
    22  }
    23  
    24  func (field *safeField) Type() Type {
    25  	panic("not implemented")
    26  }
    27  
    28  func (field *safeField) Tag() reflect.StructTag {
    29  	return field.StructField.Tag
    30  }
    31  
    32  func (field *safeField) Index() []int {
    33  	return field.StructField.Index
    34  }
    35  
    36  func (field *safeField) Anonymous() bool {
    37  	return field.StructField.Anonymous
    38  }
    39  
    40  func (field *safeField) Set(obj interface{}, value interface{}) {
    41  	val := reflect.ValueOf(obj).Elem()
    42  	val.FieldByIndex(field.Index()).Set(reflect.ValueOf(value).Elem())
    43  }
    44  
    45  func (field *safeField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) {
    46  	panic("unsafe operation is not supported")
    47  }
    48  
    49  func (field *safeField) Get(obj interface{}) interface{} {
    50  	val := reflect.ValueOf(obj).Elem().FieldByIndex(field.Index())
    51  	ptr := reflect.New(val.Type())
    52  	ptr.Elem().Set(val)
    53  	return ptr.Interface()
    54  }
    55  
    56  func (field *safeField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer {
    57  	panic("does not support unsafe operation")
    58  }