code: func FindField(pointerToAField interface{}, pointerToAStruct interface{}) (field *reflect.StructField, found bool) {
  	fieldVal := reflect.ValueOf(pointerToAField)
  
  	if fieldVal.Kind() != reflect.Ptr {
  		panic("pointerToAField must be a pointer")
  	}
  
  	strct := reflect.Indirect(reflect.ValueOf(pointerToAStruct))
  	numField := strct.NumField()
  
  	for i := 0; i < numField; i++ {
  		sf := strct.Field(i)
  
  		//logrus.DefaultLogger().Info("xxxxxxxxxxx ", sf.Kind().String(), " ", sf.String())
  
  		if sf.Kind() == reflect.Ptr || sf.Kind() == reflect.Interface {
  			if fieldVal.Interface() == sf {
  				field := strct.Type().Field(i)
  				return &field, true
  			}
  		} else if sf.CanAddr() {
  			if fieldVal.Pointer() == sf.Addr().Pointer() {
  				field := strct.Type().Field(i)
  				return &field, true
  			}
  		}
  	}
  
  	return nil, false
  }
docs: // FindField compares the pointers (pointerToAField with all fields in pointerToAStruct)