Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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 - Fatal编程技术网

Go 声明不清楚,但在重新分配时未使用

Go 声明不清楚,但在重新分配时未使用,go,Go,编辑为什么这不是上述内容的副本: 有人质疑这一错误的存在。我不是——我有一个具体的案例,原因不明,我想了解原因并找到一个简单的方法来解决它。 在中,由于变量在if范围内声明,因此发生错误。我可能的错误理解是,{and}中包含一个作用域。我的问题并非如此。如果我的理解是错误的,我很高兴如果有人解释它,我找不到任何关于有效围棋。然而,这是一个不同的问题。 编辑当前答案不令人满意的原因: apxp的答案通过在外部范围内声明ok来解决这个问题。我知道我可以做到这一点,这就是为什么我要求一个精益的方法来解

编辑为什么这不是上述内容的副本:

有人质疑这一错误的存在。我不是——我有一个具体的案例,原因不明,我想了解原因并找到一个简单的方法来解决它。 在中,由于变量在if范围内声明,因此发生错误。我可能的错误理解是,{and}中包含一个作用域。我的问题并非如此。如果我的理解是错误的,我很高兴如果有人解释它,我找不到任何关于有效围棋。然而,这是一个不同的问题。 编辑当前答案不令人满意的原因:

apxp的答案通过在外部范围内声明ok来解决这个问题。我知道我可以做到这一点,这就是为什么我要求一个精益的方法来解决这个问题。我不希望ok变量在更高的范围内浮动,因为它只是一个行李。 bserdar的回答用额外的作用域解决了这个问题。我更喜欢这个,但我发现它不太容易阅读。 编辑我从评论和答案中获得的内容:

受此处acivity的启发,我提出了以下代码来设置默认值:几行,在更高的范围内没有不必要的变量:

...
    val := 3
    if v, ok := myMap[key]; ok {
        val = v
    }
...
对我来说,一个悬而未决的问题仍然是:在哪里可以阅读if语句的范围定义,这似乎是理解此错误的关键

编辑元:

如上所述,我的问题与相关问题大不相同。我可能没有足够详细地解释我的问题是关于什么的,但我也评估它没有试图正确或善意地理解我的问题。因此,我希望删除[duplicate]标签,让投了否决票的人重新审视自己的判断

我犯了一个我无法解释的错误。下面的代码和运行示例

目标是我想用key键将映射中的值保存到val中,如果该键不存在,则应为val指定一个默认值。但我得到的错误val声明,而不是使用

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

这是一个范围问题。 要解决这个问题,您还应该声明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)
}

代码中的示例仅为if块声明了一个变量val。所以val的范围就在那个块里。因此,对于编译器,您没有使用main函数的val。

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

if val, ok := myMap[key]; !ok {
    val = 3 
}
在上面,val重新声明会隐藏在外部范围中声明的val。val=3赋值使用嵌套作用域中声明的val,并且在该赋值之后从未使用过它,因此编译器对此表示不满

只需在外部范围中声明ok,或创建一个新范围来处理它:

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

val在if语句中重新声明,这将隐藏之前声明的val。在if之前添加var ok bool,并且不要使用:=,因此val和ok将不会重新声明。根据,val只应重新声明。整个想法是,我不需要在更高的上下文中声明ok。在a:=声明中,变量v可能会出现,即使它已经被声明,前提是:此声明与现有的v声明在同一范围内。如果v已经在外部范围内声明,则声明将创建一个新变量。if语句创建了一个新的作用域。对不起,我错过了底部的fmt.Println。它抱怨的是用if语句声明的val。val的值为3,但从未使用过。在if语句中添加一个fmt.Printlnval,它应该可以工作。
var val int
{
   var ok bool
   if val, ok = myMap[key]; !ok {
     val = 3
   }
}