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

Adm*_*awn 4 if-statement variable-assignment go

我试图在 Go Lang 中设置一个带有默认值的 bool 变量并根据条件更新它。func foo编译,但函数bar未编译并给出错误“f 已声明且未使用”

有一个相关的答案- 它没有解释下一个问题

Go 中 this(bar 函数)的正确模式是什么?

这是代码:

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))
}
Run Code Online (Sandbox Code Playgroud)

jon*_*sam 7

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

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

这是一个示例注释代码,可能有助于澄清(也可作为可运行的 Go Playground代码段提供):

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"
}
Run Code Online (Sandbox Code Playgroud)

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


bas*_*hrc 5

来自go-lang 规范

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块(如果块是函数体,则为参数列表)中较早声明具有相同类型,并且至少有一个非空变量是新的

if开始一个新的块,因此该线被声明用名称的新变量f

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

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

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