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" )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .