code: func (sh *Helper) Unmarshal(v interface{}) error {
  	rv := reflect.ValueOf(v)
  	if rv.Kind() != reflect.Ptr || rv.IsNil() {
  		return ErrNotValidPtr
  	}
  	s := rv.Elem()
  	t := s.Type()
  	for i := 0; i < t.NumField(); i++ {
  		field := t.Field(i)
  		// Unmarshal recursively if field of struct is a struct
  		if s.Field(i).Kind() == reflect.Struct && s.Field(i).Type().Name() != TimeType.Name() {
  			if err := sh.Unmarshal(s.Field(i).Addr().Interface()); err != nil {
  				return err
  			}
  		} else {
  			// We get the value in the tag named regexp
  			key := field.Tag.Get("regexp")
  			if key == "" {
  				// If tag does not exist, we take field name
  				key = field.Name
  			}
  			// Get the matched value and update the interface if necessary
  			b, err := sh.GetBytes(key)
  			switch err {
  			case nil:
  				var cast interface{}
  				str := string(b)
  				switch {
  				case s.Field(i).Type().Name() == TimeType.Name() && s.Field(i).Kind() == reflect.Struct:
  					cast, err = time.Parse(sh.timeLayout, str)
  				default:
  					cast, err = strParse(&str, s.Field(i).Kind())
  				}
  				s.Field(i).Set(reflect.ValueOf(cast))
  				if err != nil {
  					return err
  				}
  			case ErrNoSuchKey:
  				// It means we cannot set the field
  				//return FieldNotSetError{field.Name}
  			default:
  				return err
  			}
  		}
  	}
  	return nil
  }
docs: // Unmarshal : unmarshal the data found by the Helper's regexp into v.
  // Helper needs to be prepared first through the Prepare function.