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

Posted

技术标签:

【中文标题】已声明且未使用 - 如何更新 IF 语句中的变量【英文标题】:Declared and not used - How to update a variable in IF Statement 【发布时间】:2019-03-28 10:03:20 【问题描述】:

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

有一个related answer - 没有解释下一个问题

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))

【问题讨论】:

Go — declared and not used error, when I think I have done so to the variable的可能重复 【参考方案1】:

给出错误“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】:

来自go-lang specification

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

if 开始一个新块,因此这一行声明了一个名为 f 的新变量。

另一方面,= 运算符是一个赋值运算符,因此前一个作用域的值会被修改。

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

 var err error 
 f, err = strconv.ParseBool(m["READWRITE"])
 if err != nil 
    panic(err)
 

【讨论】:

我发现了。但是,我真的需要编写代码 - 我根据某些输入更改默认值(这恰好包括返回的错误 - 即 bar 函数)。所以我将不胜感激任何模式帮助 @AdmiralThrawn 编辑了一种可以实现这一目标的方式【参考方案3】:

我为什么要这么说的背景:对于一个从很多其他语言迁移到 Go 的人来说,这将是一件奇怪的事情。

我在这里添加这个 - 只是为了证明显式使用临时变量可能很有用。 barNotCorrectYet,已使用 strconv.ParseBool 的“默认 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

【讨论】:

以上是关于已声明且未使用 - 如何更新 IF 语句中的变量的主要内容,如果未能解决你的问题,请参考以下文章

python之最强王者——变量,条件语循环语句

如何在将成为全局的 if/switch 语句中声明一个变量?

如何根据 if 语句更新单元格?

第二周总结

根据 SQL 管理器中的 IF 语句设置变量

oracle:如何将一个表中的一列取出来给一个已声明的变量,同时将取出的条数传给另一个已声明的变量。