声明不明确,但在重新分配时不使用

时间:2019-10-07 19:33:35

标签: go

编辑(为什么这不是上面的重复项):

编辑(为什么当前答案不令人满意):

  • apxp的答案通过在外部范围内声明ok来解决此问题。我知道我可以做到这一点,这就是为什么我要求一种 lean 解决方案。我不希望ok变量只是在行李范围内浮动。
  • bserdar给出的答案带有额外的范围。我比较喜欢这种方式,但是我觉得它不太容易阅读。

编辑(我从评论和答案中得出的内容):

受此启发性启发,我想出了这段代码来设置默认值(在较高范围内几行且没有不必要的变量):

...
    val := 3
    if v, ok := myMap[key]; ok {
        val = v
    }
...

对我来说,一个悬而未决的问题仍然是:在哪里可以阅读if语句的范围定义,这似乎是理解此错误的关键?

编辑(META)

如上所述,我的问题与链接的问题完全不同。我可能没有足够详细地解释我的问题,但是我估计这并不是试图正确或仁慈地理解我的问题。因此,我希望删除[duplicate]标签,并希望那些拒绝投票的人重新审视他们的判断。


我遇到了我无法解释的错误。下面的代码和运行示例。

我要使用键val将映射中的值保存到key中的目标主义者,如果键不存在,应为val分配一个默认值。但是我收到错误val declared and not used

myMap := map[string]int{
    "A": 1,
    "B": 2,
}
var val int
key := "A"

if val, ok := myMap[key]; !ok {
    val = 3
}

fmt.Println(val)

https://play.golang.org/p/nOVpWwgCSSe

这是怎么回事?为什么不起作用?精益方式是什么?

2 个答案:

答案 0 :(得分:0)

这是一个范围的东西。 为了解决这个问题,您还应该声明ok,然后您的代码才能正常工作。在这种情况下,您无需在if语句中使用简短声明。

func main() {
    myMap := map[string]int{
        "A": 1,
        "B": 2,
    }
    var val int
    var ok bool
    key := "A"

    if val, ok = myMap[key]; !ok {
        val = 3
    }

    fmt.Println(val)
}

https://play.golang.org/p/7iTYwxfOEnc

代码中的示例仅针对val块声明了一个变量if。因此,该val的范围就在该块内部。因此,对于编译器,您没有使用主函数的val

答案 1 :(得分:0)

已声明且从未使用过的valval语句中的if。这是一个新范围:

if val, ok := myMap[key]; !ok {
    val = 3 
}

以上,val重声明遮盖了在外部范围中声明的valval = 3分配使用在嵌套作用域中声明的val,并且在分配之后再也不会使用它,因此编译器对此有所抱怨。

只需在外部作用域中声明ok,或创建一个新的作用域来处理它:

var val int
{
   var ok bool
   if val, ok = myMap[key]; !ok {
     val = 3
   }
}