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

Golang抱怨for循环中未使用的变量

Golang抱怨for循环中未使用的变量

Go
富国沪深 2022-10-10 19:34:18
我在 golang 的 for 循环中有一个未使用的变量。我实际上是在 for 循环之外使用它。Goland 一直抱怨未使用的变量。我该如何解决?var backoffSchedule = []time.Duration{    1 * time.Second,    3 * time.Second,    10 * time.Second,}var response *http.Responsefor _, backoff := range backoffSchedule {    response, err := client.Do(request)    if err == nil {        break    }    fmt.Printf(os.Stderr, "Request error: %s", err)    fmt.Printf(os.Stderr, "Retrying in %s", backoff)    time.Sleep(backoff)}if err != nil {    fmt.Printf("CRITICAL: API request failed: %s", err)    os.Exit(2)}if response.StatusCode <= 199 || response.StatusCode >= 300 {    // Non-successful response, alert    fmt.Printf("CRITICAL: APIv request returned not ok: %s", response.Status)    os.Exit(2)它还抱怨未引用的变量err。如何使它们在函数内可用。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您有两个名为 的变量response,一个在循环内,另一个在循环外。


这是一个演示相同问题的示例。


package main


import (

    "fmt"

)


func foo() (int, error) {

    return 10, nil

}


func main() {

    someValue := 5

    

    if (someValue == 5) {

        someValue, err := foo()

        if (err == nil) {

            fmt.Println("Inside if scope:", someValue)

        }

    }

    

    fmt.Print("Outside if scope:", someValue)

}

这里的问题是您正在使用:=,默认情况下会创建一个新变量。


如果您err在范围之外声明并使用=您的代码将起作用。


package main


import (

    "fmt"

)


func foo() (int, error) {

    return 10, nil

}


func main() {

    someValue := 5

    var err error

    

    if (someValue == 5) {

        someValue, err = foo()

        if (err == nil) {

            fmt.Println("Inside if scope:", someValue)

        }

    }

    

    fmt.Print("Outside if scope:", someValue)

}

关于 go 行为方式的另一个注意事项是,如果您与已经存在的变量处于相同的范围内,那么它的工作方式会有所不同。


package main


import (

    "fmt"

)


func foo() (int, error) {

    return 10, nil

}


func main() {

    someValue := 5

    

    fmt.Println("Before foo:", someValue)

    

    someValue, err := foo()

    if (err == nil) {

        fmt.Print("After foo:", someValue)

    }

}

在这里,我们分配给相同的变量并同时someValue声明一个新变量。err:=


查看完整回答
反对 回复 2022-10-10
?
SMILET

TA贡献1796条经验 获得超4个赞

使错误消失的一种方法是err在循环外声明一个变量:

var err error

这样,您可以在循环内分配现有变量(而不是声明新变量)

for _, backoff := range backoffSchedule {
    response, err = client.Do(request)
                 ^^^

确保这是您想要的,就像response在循环之外,循环中分配的最后一个值一样。


查看完整回答
反对 回复 2022-10-10
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

为了检测错误,也许您也可以为response变量添加一个 nil 检查。这可能是您的解决方案。对于等式。


if response== nil {

    break

}

请分享您对这种情况的首选或发现的答案。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信