Guest User

Untitled

a guest
Dec 11th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.87 KB | None | 0 0
  1. func Field(target interface{}, field string, val interface{}) error {
  2. targetVal := reflect.Indirect(reflect.ValueOf(target)) // セットするstructのreflect.Valueをとる
  3. if targetVal.Kind() != reflect.Struct {
  4. return ErrNotStruct
  5. }
  6. dstVal := targetVal.FieldByName(field) // セットするフィールドのreflect.Valueをとる
  7. if !dstVal.IsValid() {
  8. return ErrNoSuchField
  9. }
  10. srcVal := reflect.ValueOf(val) // セットする値のreflect.Valueをとる
  11. if srcVal.Type() != dstVal.Type() {
  12. return ErrTypeMismatch
  13. }
  14. dstAddr := unsafe.Pointer(dstVal.UnsafeAddr()) // セットするフィールドのアドレスをとる
  15. setableField := reflect.NewAt(dstVal.Type(), dstAddr).Elem() // セットするフィールドのアドレスにval型の変数を作成する
  16. setableField.Set(srcVal) // setableFieldはただの変数なので値をセットできる
  17. return nil
  18. }
Add Comment
Please, Sign In to add comment