如果满足条件,则返回 true

我有一个功能


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 ?


Cats萌萌
浏览 215回答 3
3回答

心有法竹

您有一个匿名函数作为参数传递给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) 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go