If statement 声明但未使用-如何更新IF语句中的变量

If statement 声明但未使用-如何更新IF语句中的变量,if-statement,go,variable-assignment,If Statement,Go,Variable Assignment,我正在尝试使用默认值设置bool变量,并根据Go Lang中的条件对其进行更新。funcfoo进行编译,但函数bar未编译,并给出错误“f声明且未使用” 有一个-不能解释下一个问题 围棋中此(条形功能)的正确模式是什么? 代码如下: package main import ( "fmt" "strconv" ) func foo(m map[string]string) bool { f := false if _, exists := m["READWRITE"]; exists

我正在尝试使用默认值设置bool变量,并根据Go Lang中的条件对其进行更新。funcfoo进行编译,但函数bar未编译,并给出错误“f声明且未使用”

有一个-不能解释下一个问题

围棋中此(条形功能)的正确模式是什么?

代码如下:

package main

import (
"fmt"
"strconv"
)

func foo(m map[string]string) bool {
    f := false

if _, exists := m["READWRITE"]; exists {
    fmt.Println("Before Updating f : ", f)
    f, _ = strconv.ParseBool(m["READWRITE"])
    //if err != nil {
    //  panic(err)
    //}
}

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

return f
}

func bar(m map[string]string) bool {
    f := false

    if _, exists := m["READWRITE"]; exists {
         fmt.Println("Before Updating f : ", f)
         f, err := strconv.ParseBool(m["READWRITE"]) // error on this line "f declared and not used"
        if err != nil {
            panic(err)
        }
    }

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

    return f
}

func main() {
    m := map[string]string{"READWRITE": "true"}

    fmt.Println(foo(m))
    fmt.Println(bar(m))
}

与常规变量声明不同,短变量声明可能 重新声明提供的变量它们最初是在 相同的块(如果该块是函数,则参数列出 主体)具有相同的类型,并且至少有一个非空变量 是新的

if
启动一个新块,因此此行声明一个名为
f
的新变量

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

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

 var err error 
 f, err = strconv.ParseBool(m["READWRITE"])
 if err != nil {
    panic(err)
 }
给出错误“f已声明且未使用”

示例中的
f
是一个新声明的变量。它的作用域位于
if
块中,与最初在
main()
开头声明的作用域不同

下面是一个示例注释代码,可能有助于澄清(也可以作为可运行的Go游乐场提供):


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

关于我为什么要这么说的背景:对于一个从很多其他语言迁移过来的人来说,这将是一个奇怪的现象

我在这里添加这个-只是为了证明显式使用temp变量可能很有用。barNotCorrectYet已使用strconv.ParseBool的“default false”返回值更新了f(这将更改预设值)。因此,在我们希望忽略错误输入的情况下,将输出分配给一个临时变量,检查是否没有返回错误,然后更新预设值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
}

我发现了。但是,我真的需要编写代码——根据某些输入更改默认值(这恰好包括返回的错误——即bar函数)。。所以我很欣赏任何模式help@AdmiralThrawn用一种可以实现这一点的方式编辑可能的感谢副本是有意义的。
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
}