Go 如果满足条件,则返回true

Go 如果满足条件,则返回true,go,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.MatchStr

我有一个函数

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(谷歌云平台)和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

您有一个匿名函数作为参数传递给
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
}

您可以在外部函数中声明一个变量,并从匿名函数中设置该变量,以便它知道返回什么:

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
}

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

您只需检查此错误是否为零(无错误,一切正常),如果不匹配,则返回错误:

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
}