Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func Field(target interface{}, field string, val interface{}) error {
- targetVal := reflect.Indirect(reflect.ValueOf(target)) // セットするstructのreflect.Valueをとる
- if targetVal.Kind() != reflect.Struct {
- return ErrNotStruct
- }
- dstVal := targetVal.FieldByName(field) // セットするフィールドのreflect.Valueをとる
- if !dstVal.IsValid() {
- return ErrNoSuchField
- }
- srcVal := reflect.ValueOf(val) // セットする値のreflect.Valueをとる
- if srcVal.Type() != dstVal.Type() {
- return ErrTypeMismatch
- }
- dstAddr := unsafe.Pointer(dstVal.UnsafeAddr()) // セットするフィールドのアドレスをとる
- setableField := reflect.NewAt(dstVal.Type(), dstAddr).Elem() // セットするフィールドのアドレスにval型の変数を作成する
- setableField.Set(srcVal) // setableFieldはただの変数なので値をセットできる
- return nil
- }
Add Comment
Please, Sign In to add comment