package reflect2 import ( "reflect" "unsafe" ) type UnsafeStructField struct { reflect.StructField structType *UnsafeStructType rtype unsafe.Pointer ptrRType unsafe.Pointer } func newUnsafeStructField(structType *UnsafeStructType, structField reflect.StructField) *UnsafeStructField { return &UnsafeStructField{ StructField: structField, rtype: unpackEFace(structField.Type).data, ptrRType: unpackEFace(reflect.PtrTo(structField.Type)).data, structType: structType, } } func (field *UnsafeStructField) Offset() uintptr { return field.StructField.Offset } func (field *UnsafeStructField) Name() string { return field.StructField.Name } func (field *UnsafeStructField) PkgPath() string { return field.StructField.PkgPath } func (field *UnsafeStructField) Type() Type { return field.structType.cfg.Type2(field.StructField.Type) } func (field *UnsafeStructField) Tag() reflect.StructTag { return field.StructField.Tag } func (field *UnsafeStructField) Index() []int { return field.StructField.Index } func (field *UnsafeStructField) Anonymous() bool { return field.StructField.Anonymous } func (field *UnsafeStructField) Set(obj interface{}, value interface{}) { objEFace := unpackEFace(obj) assertType("StructField.SetIndex argument 1", field.structType.ptrRType, objEFace.rtype) valueEFace := unpackEFace(value) assertType("StructField.SetIndex argument 2", field.ptrRType, valueEFace.rtype) field.UnsafeSet(objEFace.data, valueEFace.data) } func (field *UnsafeStructField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { fieldPtr := add(obj, field.StructField.Offset, "same as non-reflect &v.field") typedmemmove(field.rtype, fieldPtr, value) } func (field *UnsafeStructField) Get(obj interface{}) interface{} { objEFace := unpackEFace(obj) assertType("StructField.GetIndex argument 1", field.structType.ptrRType, objEFace.rtype) value := field.UnsafeGet(objEFace.data) return packEFace(field.ptrRType, value) } func (field *UnsafeStructField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { return add(obj, field.StructField.Offset, "same as non-reflect &v.field") }