Вернуть true, если условие выполнено - PullRequest
2 голосов
/ 21 января 2020

У меня есть функция

func checkIfRouteExists(ctx context.Context, req *compute.RoutesListCall, IP string) bool {
    if err := req.Pages(ctx, func(page *compute.RouteList) error {
        for _, route := range page.Items {
            matched, _ := regexp.MatchString(IP , route.DestRange)
            if matched {
                log.Printf("IP %v has matched", IP)

            }
        }
        return nil
    }); err != nil {
        log.Fatal(err)
    }
}

Функция принимает контексты в качестве аргументов для подключения к GCP (Google Cloud Platform) и IP. Он берет IP и сравнивает его, доступен ли этот IP в GCP. Если совпадение происходит, я хочу, чтобы вся функция возвращала true

Если я делаю что-то вроде

if matched {
    log.Printf("IP %v has matched", IP)
    return true
}

, она жалуется, говоря

Cannot use 'true' (type bool) as type error Type does not implement 'error' as some methods are missing: Error() string 

Если я поставлю return true в конце функции, он в основном возвращает true для всего.

Куда именно я могу поместить возврат, чтобы функция возвращала true только тогда, когда у меня есть соответствие IP?

Ответы [ 3 ]

4 голосов
/ 21 января 2020

В качестве аргумента req.Pages() передана анонимная функция. Вы не можете использовать оператор return внутри литерала функции для возврата из внешней функции. Внутренняя функция имеет error тип возвращаемого значения, поэтому вы не можете вернуть bool из нее, только error.

Один из способов справиться с этим - объявить локальную переменную вне внутренней функции, и внутри внутренней функции назначьте значение, которое вы хотите вернуть из внешней функции, поэтому внешняя функция может сделать именно это: вернуть значение, назначенное во внутренней функции. Удобно, что это может быть сам параметр результата: именованный тип возвращаемого значения.

func checkIfRouteExists(ctx context.Context, req *compute.RoutesListCall, IP string) (result bool) {
    if err := req.Pages(ctx, func(page *compute.RouteList) error {
        for _, route := range page.Items {
            matched, _ := regexp.MatchString(IP , route.DestRange)
            if matched {
                log.Printf("IP %v has matched", IP)
                result = true
                return nil
            }
        }
        return nil
    }); err != nil {
        log.Fatal(err)
    }
    return // This returns what's currently in the result variable
}
1 голос
/ 21 января 2020

Ваша функция вызывает другую функцию, и эта другая функция (func(page *compute.RouteList) error) возвращает ошибку.

Вы можете просто проверить, равна ли эта ошибка нулю (ошибки нет, все в порядке) и возвращает ошибку, если она есть не соответствует:

func checkIfRouteExists(ctx context.Context, req *compute.RoutesListCall, IP string) bool {

    hasMatchingError := req.Pages(ctx, func(page *compute.RouteList) error {
        for _, route := range page.Items {
            matched, _ := regexp.MatchString(IP , route.DestRange)
            if matched {
                log.Printf("IP %v has matched", IP)
                return nil
            }
        }
        return errors.New(`No match found`)
    })

    if hasMatchingError != nil {
        log.Fatal(hasMatchingError)
    }
    return hasMatchingError == nil
}
1 голос
/ 21 января 2020

Вы можете объявить переменную во внешней функции и установить ее из анонимной функции, чтобы она знала, что возвращать:

func checkIfRouteExists(ctx context.Context, req *compute.RoutesListCall, IP string) bool {
    var matched bool
    if err := req.Pages(ctx, func(page *compute.RouteList) error {
        for _, route := range page.Items {
            matched, _ = regexp.MatchString(IP , route.DestRange)
            if matched {
                log.Printf("IP %v has matched", IP)
                return nil
            }
        }
        return nil
    }); err != nil {
        log.Fatal(err)
    }
  return matched
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...