Go:如何声明一个新变量并覆盖一个更高范围的变量?
我在任何地方都找不到答案,所以情况是这样的:Go:如何声明一个新变量并覆盖一个更高范围的变量?,go,scope,declaration,Go,Scope,Declaration,我在任何地方都找不到答案,所以情况是这样的: // err has not yet been declared here globalVar := "string" if globalVar == "string" { globalVar, err := doSomethingWithString() if err != nil { // error handling } } 第二个globalVar声明给出了一个错误,当使用“=”时: 使用:=它表示
// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
globalVar, err := doSomethingWithString()
if err != nil {
// error handling
}
}
第二个globalVar
声明给出了一个错误,当使用“=”时:
- 使用
它表示:=
,因为现在globalVar是内部范围中的一个新变量globalVar已声明且未使用
- 使用
时,它会显示=
未定义的错误,因为它尚未声明
=
和:=
之间的差异
我看到了两种可能的解决方案,在我看来,这两种方案都同样丑陋:
// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
globalVar2, err := doSomethingWithString()
if err != nil {
// error handling
}
globalVar = globalVar2
}
或
我是否必须使用这些变通方法中的一种,或者是否有一种正确的方法来实现我所需要的
第二种解决方案看起来最不难看,但是如果有许多变量只需要在if作用域中使用,那么这些变量将不会在作用域之后被删除,并保留整个外部作用域。因此,在我看来,第一种解决方案似乎是最好的
但我想听听其他人是如何解决这种情况的 在本例中,不要使用:=和predeclare都是globalVar和err
var (
globalVar string
err error
)
globalVar = "string"
if globalVar == "string" {
globalVar, err = doSomethingWithString()
if err != nil {
// error handling
}
}
或者,如果要限制err的范围:
globalVar := "string"
if globalVar == "string" {
var err error
globalVar, err = doSomethingWithString()
if err != nil {
// error handling
}
}
如需类似于上一个答案的示例
:=是为了方便您在一条语句中声明和赋值。如果它碍事了,就不要使用它。在第二个解决方法(实际上是正确的)中,应该将
err:=errors.New(“”
替换为var error
。无需创建新的空错误,只需将其设为零即可。谢谢,这已经让它变得更干净了。但是这是做这件事最“正确”的方法吗?:=按照它说的做,即声明并分配给新变量。根据之前声明的内容,您希望它在部分返回值中充当:=而在另一部分返回值中充当=。然后,将对每个:=进行分析:它是声明并赋值还是仅赋值?这是不一致的,伊姆霍。这就是我想说的一点。有时您需要在一条语句中同时使用=
和:=
功能。据我所知,这是不可能的。这是一个开放的问题,请参阅,可能还有其他合并的问题。对于如何补救,或者是否应该这样做,似乎没有达成共识。最后一个解决方案是我没有想到的。这对我来说似乎是最好的。谢谢用一个本应是可重用的TCP连接来避免我的头发撕裂!谢谢
globalVar := "string"
if globalVar == "string" {
var err error
globalVar, err = doSomethingWithString()
if err != nil {
// error handling
}
}