Golang Switch 变量作用域

5

我正在尝试理解Golang中的简单Switch语句,但是我卡在了变量作用域上。

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语句体之后可用。 但编译器返回了以下错误信息(来自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

我很好奇,switch语句体内的变量作用域是否与在函数中声明的不同?如何修改这段代码才能够在switch语句体后获取数据?


3
“:=” 应该改为 “=” 。 - tkausl
重复的问题 https://dev59.com/mXXYa4cB1Zd3GeqP9LGr - Jonathan Hall
1个回答

8

您的问题在这一行:

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

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

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

请注意这里使用了赋值符号=而不是短声明符:=

是的,这就是问题所在。我一开始没有注意到。感谢您的帮助。 - pag-r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接