github.com/modern-go/Reflect2@v1.0.1/unsafe_struct.go (about)

     1  package reflect2
     2  
     3  import (
     4  	"reflect"
     5  	"unsafe"
     6  )
     7  
     8  type UnsafeStructType struct {
     9  	unsafeType
    10  	likePtr bool
    11  }
    12  
    13  func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType {
    14  	return &UnsafeStructType{
    15  		unsafeType: *newUnsafeType(cfg, type1),
    16  		likePtr:    likePtrType(type1),
    17  	}
    18  }
    19  
    20  func (type2 *UnsafeStructType) LikePtr() bool {
    21  	return type2.likePtr
    22  }
    23  
    24  func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} {
    25  	objEFace := unpackEFace(obj)
    26  	assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype)
    27  	return type2.UnsafeIndirect(objEFace.data)
    28  }
    29  
    30  func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
    31  	if type2.likePtr {
    32  		return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr))
    33  	}
    34  	return packEFace(type2.rtype, ptr)
    35  }
    36  
    37  func (type2 *UnsafeStructType) FieldByName(name string) StructField {
    38  	structField, found := type2.Type.FieldByName(name)
    39  	if !found {
    40  		return nil
    41  	}
    42  	return newUnsafeStructField(type2, structField)
    43  }
    44  
    45  func (type2 *UnsafeStructType) Field(i int) StructField {
    46  	return newUnsafeStructField(type2, type2.Type.Field(i))
    47  }
    48  
    49  func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField {
    50  	return newUnsafeStructField(type2, type2.Type.FieldByIndex(index))
    51  }
    52  
    53  func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField {
    54  	structField, found := type2.Type.FieldByNameFunc(match)
    55  	if !found {
    56  		panic("field match condition not found in " + type2.Type.String())
    57  	}
    58  	return newUnsafeStructField(type2, structField)
    59  }