如果满足条件,则返回true

时间:2020-01-20 21:18:58

标签: go

我有一个功能

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云平台)和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。

我应该在哪里精确地放置返回值,以便仅当我有IP匹配时函数才返回true?

3 个答案:

答案 0 :(得分:4)

您有一个匿名函数作为参数传递给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 :(得分:1)

您可以在外部函数中声明一个变量,然后从匿名函数中对其进行设置,以便它知道返回什么:

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
}

答案 2 :(得分:1)

您的函数正在调用另一个函数,而另一个函数(func(page *compute.RouteList) error)返回错误。

您可以检查此错误为nil(没有错误,都很好),如果没有匹配项,则返回错误:

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
}