Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:如何声明一个新变量并覆盖一个更高范围的变量?_Go_Scope_Declaration - Fatal编程技术网

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
    }
}