code: func getRelatedField(instance interface{}, name string) (string, TagOptions) {
  	var (
  		value      = reflect.Indirect(reflect.ValueOf(instance))
  		fieldName  string
  		tagOptions TagOptions
  	)
  
  	for i := 0; i < value.NumField(); i++ {
  		var (
  			vField     = value.Field(i)
  			tField     = value.Type().Field(i)
  			tagOptions = getTagOptions(tField.Tag.Get(TagName))
  		)
  
  		if tField.Type.Kind() == reflect.Struct && tField.Anonymous {
  			if n, o := getRelatedField(vField.Interface(), name); n != "" {
  				return n, o
  			}
  		}
  
  		if v, ok := tagOptions[FieldOptionName]; ok && v == name {
  			return tField.Name, tagOptions
  		}
  
  		if tField.Name == name {
  			return tField.Name, tagOptions
  		}
  	}
  
  	return fieldName, tagOptions
  }
docs: // getRelatedField returns first matching field.