github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgType/PtrType.go (about) 1 package kmgType 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 //path -> pass to RefType 9 type PtrType struct { 10 reflectTypeGetterImp 11 elemType KmgType 12 } 13 14 func (t *PtrType) init() (err error) { 15 if t.elemType != nil { 16 return 17 } 18 t.elemType, err = TypeOf(t.GetReflectType().Elem()) 19 return 20 } 21 func (t *PtrType) SaveByPath(inV *reflect.Value, path Path, value string) error { 22 err := t.init() 23 if err != nil { 24 return err 25 } 26 //create 27 if inV.IsNil() { 28 if inV.CanSet() { 29 inV.Set(reflect.New(t.GetReflectType().Elem())) 30 } else { 31 *inV = reflect.New(t.GetReflectType().Elem()) 32 } 33 } 34 //a elem of a ptr CanSet must be true. 35 elemV := inV.Elem() 36 if len(path) >= 1 { 37 return t.elemType.SaveByPath(&elemV, path[1:], value) 38 } 39 return nil 40 } 41 func (t *PtrType) GetElemByString(v reflect.Value, k string) (ev reflect.Value, et KmgType, err error) { 42 err = t.init() 43 if err != nil { 44 return 45 } 46 if v.IsNil() { 47 err = fmt.Errorf("[PtrType.GetElemByString] get null pointer k:%s", k) 48 return 49 } 50 ev = v.Elem() 51 et = t.elemType 52 return 53 } 54 func (t *PtrType) DeleteByPath(v *reflect.Value, path Path) (err error) { 55 if len(path) > 1 { 56 return passThougthDeleteByPath(t, v, path) 57 } else if len(path) == 0 { 58 return fmt.Errorf("[PtrType.DeleteByPath] delete ptr with no path.") 59 } 60 nilPtr := reflect.Zero(t.GetReflectType()) 61 if v.CanSet() { 62 v.Set(nilPtr) 63 } else { 64 *v = nilPtr 65 } 66 return nil 67 }