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
}