If statement 声明但未使用-如何更新IF语句中的变量
我正在尝试使用默认值设置bool变量,并根据Go Lang中的条件对其进行更新。funcfoo进行编译,但函数bar未编译,并给出错误“f声明且未使用” 有一个-不能解释下一个问题 围棋中此(条形功能)的正确模式是什么? 代码如下: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
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
}