代码之家  ›  专栏  ›  技术社区  ›  pag-r

Golang开关变量范围

  •  2
  • pag-r  · 技术社区  · 6 年前

    我正在试图找出Golang中的简单切换,而我一直在使用变量范围。

    var body string
    var errs error
    req := gorequest.New()
    var resp gorequest.Response
    switch verb {
    case 0:
        resp, body, errs := req.Get(suburl).
            Set("X-Auth-Token", d.Token).
            Set("Content-type", "application/json").
            End()
    }
    if errs != nil {
        return &ConnResponse{resp.StatusCode, body, fmt.Errorf("%s", errs)}
    }
    

    我在switch之前声明了resp、body、errs和req,我认为它们将在switch body之后可用。 编译器返回的错误如下(来自case声明)

    # command-line-arguments
    ./conn.go:135:3: resp declared and not used
    ./conn.go:135:9: body declared and not used
    ./conn.go:135:15: errs declared and not used
    

    所以我很好奇,开关体内的变量作用域是否与函数中声明的不同?在切换主体之后,这段代码将如何访问数据。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Adrian    6 年前

    您的问题在这一行:

    resp, body, errs := req.Get(suburl)
    

    短变量声明运算符 := 创建新变量 并为其赋值。这些 变量被称为在外部作用域中创建的变量的“阴影”,因为它们具有相同的名称,因此它们从该作用域中“隐藏”外部作用域的变量。要解决这个问题,只需从外部范围为现有变量赋值,而不是创建新变量:

    resp, body, errs = req.Get(suburl)
    

    注意此处的赋值用法 = 而不是简短的声明 :=