code: func (c *Converter) convertKV(skv, dkv kvValue, scope *scope) error {
  	if skv == nil || dkv == nil {
  		// TODO: add keys to stack to support really understandable error messages.
  		return fmt.Errorf("Unable to convert %#v to %#v", skv, dkv)
  	}
  
  	lister := dkv
  	if scope.flags.IsSet(SourceToDest) {
  		lister = skv
  	}
  
  	var mapping FieldMappingFunc
  	if scope.meta != nil && scope.meta.KeyNameMapping != nil {
  		mapping = scope.meta.KeyNameMapping
  	}
  
  	for _, key := range lister.keys() {
  		if found, err := c.checkField(key, skv, dkv, scope); found {
  			if err != nil {
  				return err
  			}
  			continue
  		}
  		stag := skv.tagOf(key)
  		dtag := dkv.tagOf(key)
  		skey := key
  		dkey := key
  		if mapping != nil {
  			skey, dkey = scope.meta.KeyNameMapping(key, stag, dtag)
  		}
  
  		df := dkv.value(dkey)
  		sf := skv.value(skey)
  		if !df.IsValid() || !sf.IsValid() {
  			switch {
  			case scope.flags.IsSet(IgnoreMissingFields):
  				// No error.
  			case scope.flags.IsSet(SourceToDest):
  				return scope.errorf("%v not present in dest", dkey)
  			default:
  				return scope.errorf("%v not present in src", skey)
  			}
  			continue
  		}
  		scope.srcStack.top().key = skey
  		scope.srcStack.top().tag = stag
  		scope.destStack.top().key = dkey
  		scope.destStack.top().tag = dtag
  		if err := c.convert(sf, df, scope); err != nil {
  			return err
  		}
  	}
  	return nil
  }
docs: // convertKV can convert things that consist of key/value pairs, like structs
  // and some maps.