为了账号安全,请及时绑定邮箱和手机立即绑定

如果满足条件,则返回 true

如果满足条件,则返回 true

Go
Cats萌萌 2022-05-05 18:11:08
我有一个功能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 ?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

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

}


查看完整回答
反对 回复 2022-05-05
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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


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

}


查看完整回答
反对 回复 2022-05-05
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您的函数正在调用另一个函数,而另一个函数 ( 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

}


查看完整回答
反对 回复 2022-05-05
  • 3 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号