声明且未使用-如何在IF语句中更新变量

时间:2018-10-24 05:01:01

标签: if-statement go variable-assignment

我试图在Go Lang中使用默认值设置bool变量并根据条件对其进行更新。函数 foo 可以编译,但是函数 bar 无法编译,并给出错误“ f已声明且未使用”

有一个related answer-无法解释下一个问题

Go中此(栏功能)的正确模式是什么?

代码如下:

del df[' ']

3 个答案:

答案 0 :(得分:4)

来自go-lang specification

  

与常规变量声明不同,简短的变量声明可能   重新声明变量,前提是它们最初是在以下位置声明的   相同的块(如果块是函数,则参数列出   正文),并且具有至少一个非空白变量   是新的

if开始一个新块,因此此行声明了一个名称为f的新变量。

另一方面,=运算符是赋值运算符,因此前一个作用域的值被修改。

如果要重复使用相同的变量,可以显式声明err

 var err error 
 f, err = strconv.ParseBool(m["READWRITE"])
 if err != nil {
    panic(err)
 }

答案 1 :(得分:3)

  

给出错误“ f已声明且未使用”

示例中的

f是新声明的变量。它的范围位于if块中,并且与main()开始时最初声明的块不同。

下面是一个示例注释的代码,可以帮助阐明(也可以作为可运行的Go Playground snippet使用):

package main

import (
    "fmt"
)

func main() {
    food := "burger"                 // (1) variable 'food' is declared
    fmt.Println("food is", food)     // OUTPUT: "burger"

    if true {
        food := "fries"              // (2) a new 'food' variable is a declared here. it shadows the one in (1)
        fmt.Println("food is", food) // this accesses the 'food' var from (2). OUTPUT: "fries"
    }

    fmt.Println("food is", food)     // this accesses the variable from (1). OUTPUT: "burger"
}

希望这有助于澄清。干杯,

答案 2 :(得分:0)

我为何要这么说的背景:对于一个从其他多种语言迁移到Go的人来说,这很奇怪。

我在这里添加-只是为了证明明确使用temp变量可能有用。 barNotCorrectYet,使用来自strconv.ParseBool的“ default false”返回值更新了f(这将更改预设值)。因此,在我们要忽略错误输入的情况下,将输出分配给temp变量将很有用,请检查是否未返回错误,然后更新预设值 barCorrectHandlingOfTempVariable

func barNotCorrectYet(m map[string]string) bool {
f := true // preset value of variable

if _, exists := m["READWRITE"]; exists {
    var err error

    fmt.Println("Before Updating f : ", f)

    f, err = strconv.ParseBool(m["READWRITE"])
    if err != nil {
        // If error, wrong value got updated on f.. and erased preset value
    }   

}

fmt.Println("[Value could be wrong] After Updating f : ", f)

return f
}

func barCorrectHandlingOfTempVariable(m map[string]string) bool {
f := true // preset value of variable

if _, exists := m["READWRITE"]; exists {

    fmt.Println("Before Updating f : ", f)

    temp, err := strconv.ParseBool(m["READWRITE"])
    if err != nil { // Update only when there are no errors to not affect preset value
        f = temp
    }       
}

fmt.Println("After Updating f : ", f)

return f
}