【问题标题】:What's error of my program? I already use these values? [duplicate]我的程序有什么错误?我已经使用这些值了吗? [复制]
【发布时间】:2018-07-13 17:29:25
【问题描述】:

我是 golang 新手,这是我的程序:

func main() {
    checkParam(os.Args)

    var got,bj,ll float32
    var dur int
    var err error

    if bj, err := strconv.ParseFloat(os.Args[1], 32); err != nil {
        usageExit()
    }

    if ll, err := strconv.ParseFloat(os.Args[2], 32); err != nil {
        usageExit()
    }

    if dur, err := strconv.Atoi(os.Args[3]); err != nil {
        usageExit()
    }

    for i := 0; i < dur; i++ {
        got := bj * (1.0 + ll)
    }
    fmt.Print("Result: %f", got)

    _ = got
    _ = bj
    _ = ll
    _ = dur
    _ = err }

但我在运行时遇到错误:

gateway@gateway-virtual-machine:basic$ go run fulijisuan.go
command-line-arguments
./fulijisuan.go:27:47: bj declared and not used
./fulijisuan.go:31:47: ll declared and not used
./fulijisuan.go:35:38: dur declared and not used 
./fulijisuan.go:40:22: got declared and not used

在我看来,我在上面定义了err/bj/ll/fur/got,然后使用这些值来接受Args。

为什么我得到错误?我想我已经使用了这些值。

已经修复了,将 := 替换为 = 。

【问题讨论】:

  • 仅仅给它们赋值并不认为是在使用它们。如果您不需要读取该值,请不要分配给它们。
  • 这不是关于未使用变量的问题,而是关于 if 范围内的新变量的问题。

标签: go


【解决方案1】:

您正确定义了变量,但您没有使用它们。使用它们或至少分配给_

_ = err

在大多数编程语言中,您最多会收到未使用变量的警告。 Go 强制使用每个声明的变量,并会因您刚刚遇到的错误而停止编译。

通过在 if 块作用域中使用 :=,您声明了具有相同名称的新变量,但未在该作用域中使用新变量。

【讨论】:

  • 为什么这个答案被标记了?没错。
【解决方案2】:

Golang FAQ 部分提到了未使用变量的错误原因:

未使用变量的存在可能表明存在错误,而未使用 导入只会减慢编译速度,这种效果可能会变成 随着时间的推移,程序会积累代码和程序员。 由于这些原因,Go 拒绝编译未使用的程序 变量或进口,以短期便利换长期 构建速度和程序清晰度。

你声明的变量应该在你的程序中主范围内的块级别使用。这就是错误的原因

func main() {
    checkParam(os.Args)

    var got,bj,ll float32
    var dur int
    var err error

    if bj, err := strconv.ParseFloat(os.Args[1], 32); err != nil {
        usageExit()
    }

    fmt.Println(bj) // use declared variables in your program
}

如果你真的想跳过像 err 这样的变量,你可以像下面这样使用 _

bj, _ := strconv.ParseFloat(os.Args[1], 32)

【讨论】:

  • 广义上是静态分析。这种级别的检查可以存在于任何语言中(实际上它经常存在——例如,动态类型语言 JavaScript 和 Perl 具有检测未使用变量并发出警告的第三方工具)。 Go 刚刚选择将此检查放入编译器本身,而不是第三方工具中。
  • 我猜就像垃圾回收一样
  • 如果您的意思是 GC 可以存在于静态类型语言和动态类型语言中,是的,在这方面是相似的。当然 GC 不是静态分析功能——它是运行时功能,所以在这方面,不相关:)
  • 感谢@Flimzy 抽出宝贵时间。我也看过这个FAQ 部分。它解释了为什么它是错误而不是警告的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多