【问题标题】:"variable declared and not used" compilation error“已声明但未使用的变量”编译错误
【发布时间】:2010-12-15 16:17:45
【问题描述】:

我正在学习 Google 的新语言 Go。我只是在尝试一些东西,我注意到 如果您声明一个变量并且不对其执行任何操作,则 go 编译器(在我的情况下为 8g)无法
编译时出现此错误:hello.go:9: error declared and not used。我对此感到惊讶,因为大多数语言编译器只是警告你未使用的变量但仍然编译。

无论如何我可以解决这个问题吗?我检查了编译器的文档,没有看到任何会改变这种行为的东西。有没有办法只删除error 以便编译?

package main

import "fmt"
import "os"

func main()
{
     fmt.Printf("Hello World\n");
     cwd, error := os.Getwd();
     fmt.Printf(cwd);
}

【问题讨论】:

  • os.Getwd 返回一个字符串和错误对象。我试过“cwd := os.Getwd();”这给出了一个错误,因为 os.Getwd 返回两个对象。
  • 我有点喜欢强制执行经常使用的“警告是错误”范例的编译器;)
  • 是的,但是 GC 语言中未使用的变量真的值得“错误”吗?
  • @Pynt:我认为假设是由于您不必声明变量,因此代码中的任何变量都是有原因的;因此,如果您想使用它而不使用它,那可能是一个错误。它还鼓励错误检查。
  • 根据 Rob Pike 在他的 Go 技术演讲中的说法,这是一个错误的动机是设计者想要强制删除 cruft。

标签: variables go compiler-errors declaration


【解决方案1】:

你可以试试这个:

cwd, _ := os.Getwd();

但似乎最好将错误保留在 Jurily 的回答中,这样您就知道是否出了问题。

【讨论】:

  • 谢谢。由于某种原因, os.Getwd() 返回的错误不是 nil 但 cwd 仍然是正确的字符串。诡异的。也许错误永远不会为零。
【解决方案2】:

这会使开发变得有点痛苦。有时我运行的代码声明了变量但未使用(但被使用)。

在这些情况下,我很简单地这样做:

fmt.Printf("%v %v %v",somevar1,somevar2,somevar3)

在那里,它们被“使用”了。

我希望看到 go 工具的标志,让我在开发时抑制此错误。

【讨论】:

  • 是的,这很烦人。
【解决方案3】:

这行得通吗?

cwd, error := os.Getwd();
if error == nil {
    fmt.Printf(cwd);
}

【讨论】:

    【解决方案4】:

    你可以通过导入“fmt”并使用来找出错误所在

    cwd, err := os.Getwd();
    if err != nil {
        fmt.Printf("Error from Getwd: %s\n", err)
    }
    

    它打印什么?

    【讨论】:

      【解决方案5】:

      我的情况和你一样。来自docs

      我可以停止这些关于我未使用的变量/导入的投诉吗?

      未使用变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度。在你的代码树中积累足够多的未使用的导入,事情会变得非常缓慢。由于这些原因,Go 两者都不允许。

      在开发代码时,通常会临时创建这些情况,并且在程序编译之前必须将它们编辑出来可能会很烦人。

      有些人要求提供编译器选项来关闭这些检查或至少将它们减少为警告。但是,没有添加这样的选项,因为编译器选项不应该影响语言的语义,而且 Go 编译器不报告警告,只报告阻止编译的错误。

      没有警告有两个原因。首先,如果值得抱怨,那就值得在代码中修复。 (如果它不值得修复,那就不值得一提。)其次,让编译器生成警告会鼓励实现警告可能使编译嘈杂的弱案例,掩盖应该修复的真正错误。

      不过,解决这种情况很容易。使用空白标识符让未使用的东西在开发过程中保持不变。

      import "unused"
      
      // This declaration marks the import as used by referencing an
      // item from the package.
      var _ = unused.Item  // TODO: Delete before committing!
      
      func main() {
          debugData := debug.Profile()
          _ = debugData // Used only during debugging.
          ....
      }
      

      【讨论】:

        【解决方案6】:

        如果你真的只是想删除编译错误,你可以尝试类似'a = a'或'error = error'。

        这里有些人的论点,说这样的编译错误很好,因为它们可以防止很多麻烦,在大多数情况下都是正确的,所以你应该避免这样的结构。另一方面,我很喜欢测试我写的代码是否真的可以编译!在这种情况下,这很好,不必删除所有已声明和未使用的变量。所以很少使用 'a = a' 结构,不要把它们留在那里!

        【讨论】:

        • 在Go中,不要写a = a,写_ = a
        • _ = aa = a 有什么优势?
        • _ = a 的一个优点是下划线是 Go 的惯用方式,用于表达不使用值的想法。使用 _ 可以让其他程序员清楚地了解代码的含义。
        【解决方案7】:

        您可以通过以下两种方法之一解决未使用的变量问题。

        1. 通过解决错误

          cwd, error := os.Getwd() if error !=nil{ fmt.Println(error) }

        2. 这里我们不需要值本身,所以我们用 空白标识符“_”

          cwd, _ := os.Getwd()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多