package reflect2 import ( "reflect" "unsafe" ) type UnsafeStructType struct { unsafeType likePtr bool } func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType { return &UnsafeStructType{ unsafeType: *newUnsafeType(cfg, type1), likePtr: likePtrType(type1), } } func (type2 *UnsafeStructType) LikePtr() bool { return type2.likePtr } func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} { objEFace := unpackEFace(obj) assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) return type2.UnsafeIndirect(objEFace.data) } func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { if type2.likePtr { return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) } return packEFace(type2.rtype, ptr) } func (type2 *UnsafeStructType) FieldByName(name string) StructField { structField, found := type2.Type.FieldByName(name) if !found { return nil } return newUnsafeStructField(type2, structField) } func (type2 *UnsafeStructType) Field(i int) StructField { return newUnsafeStructField(type2, type2.Type.Field(i)) } func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField { return newUnsafeStructField(type2, type2.Type.FieldByIndex(index)) } func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField { structField, found := type2.Type.FieldByNameFunc(match) if !found { panic("field match condition not found in " + type2.Type.String()) } return newUnsafeStructField(type2, structField) }