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)
给出错误“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)
希望这有助于澄清。干杯,
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块(如果块是函数体,则为参数列表)中较早声明具有相同类型,并且至少有一个非空变量是新的
在if开始一个新的块,因此该线被声明用名称的新变量f。
另一方面,=运算符是赋值运算符,因此修改了先前作用域中的值。
如果要重复使用相同的变量,可以err显式声明。
var err error
f, err = strconv.ParseBool(m["READWRITE"])
if err != nil {
panic(err)
}
Run Code Online (Sandbox Code Playgroud)