编辑(为什么这不是上面的重复项):
if
范围中声明了变量。我的理解(可能是错误的)是,作用域包含在{
和}
中。我的问题不是这种情况。如果我的理解是错误的,那么有人解释会很高兴(我无法在有效执行中找到任何信息)。但是,这是一个不同的问题。编辑(为什么当前答案不令人满意):
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
这是怎么回事?为什么不起作用?精益方式是什么?
答案 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)
已声明且从未使用过的val
是val
语句中的if
。这是一个新范围:
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
}
}