我有一个功能
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?
答案 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
}