code: func (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) {
  
  	fv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false)
  
  	if len(structFieldName) == 0 {
  		structFieldName = fieldName
  	}
  
  	v.str1 = string(append(v.ns, fieldName...))
  
  	if v.v.hasTagNameFunc || fieldName != structFieldName {
  		v.str2 = string(append(v.actualNs, structFieldName...))
  	} else {
  		v.str2 = v.str1
  	}
  
  	if kind == reflect.Invalid {
  
  		v.errs = append(v.errs,
  			&fieldError{
  				v:              v.v,
  				tag:            tag,
  				actualTag:      tag,
  				ns:             v.str1,
  				structNs:       v.str2,
  				fieldLen:       uint8(len(fieldName)),
  				structfieldLen: uint8(len(structFieldName)),
  				param:          param,
  				kind:           kind,
  			},
  		)
  		return
  	}
  
  	v.errs = append(v.errs,
  		&fieldError{
  			v:              v.v,
  			tag:            tag,
  			actualTag:      tag,
  			ns:             v.str1,
  			structNs:       v.str2,
  			fieldLen:       uint8(len(fieldName)),
  			structfieldLen: uint8(len(structFieldName)),
  			value:          fv.Interface(),
  			param:          param,
  			kind:           kind,
  			typ:            fv.Type(),
  		},
  	)
  }
docs: // ReportError reports an error just by passing the field and tag information