我试图在Go Lang中使用默认值设置bool变量并根据条件对其进行更新。函数 foo 可以编译,但是函数 bar 无法编译,并给出错误“ f已声明且未使用”
有一个related answer-无法解释下一个问题
Go中此(栏功能)的正确模式是什么?
代码如下:
del df[' ']
答案 0 :(得分:4)
与常规变量声明不同,简短的变量声明可能 重新声明变量,前提是它们最初是在以下位置声明的 相同的块(如果块是函数,则参数列出 正文),并且具有至少一个非空白变量 是新的
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
}