如何避免恼人的错误“声明和未使用”

时间:2014-02-13 02:09:49

标签: go

我正在学习Go但我觉得编译时有点烦人,我不应该留下任何变量或包未使用。

这真的让我慢下来。例如,我只是想声明一个新包并计划稍后使用它或者只是取消注释一些命令来测试。我总是得到错误,需要对所有这些用途进行评论。

有没有办法在Go中避免这种检查?

8 个答案:

答案 0 :(得分:176)

此错误会强制您编写更好的代码,并确保使用您声明或导入的所有内容。它可以更容易地读取其他人编写的代码(您始终确保将使用所有声明的变量),并避免一些可能的死代码。

但是,如果您确实想跳过此错误,可以使用blank identifier_):

package main

import (
    "fmt" // imported and not used: "fmt"
)

func main() {
    i := 1 // i declared and not used
}

变为

package main

import (
    _ "fmt" // no more error
)

func main() {
    i := 1 // no more error
    _ = i
}

正如kostix在下面的评论中所说,你可以找到围棋团队的官方立场in the FAQ

  

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

答案 1 :(得分:21)

根据the FAQ

  

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

     

没有警告有两个原因。首先,如果它值得抱怨,那么值得在代码中修复。 (如果不值得修复,则不值得一提。)其次,让编译器生成警告会鼓励实现警告可能使编译噪声的弱情况,掩盖应该修复的实际错误。

由于各种原因,我不一定同意这一点。它就是这样,并且不太可能在不久的将来改变。

对于软件包,有goimports工具可以自动添加缺少的软件包并删除未使用的软件包。例如:

# Install it
$ go get golang.org/x/tools/cmd/goimports

# -w to write the source file instead of stdout
$ goimports -w my_file.go

你应该可以从任何一个中等体面的编辑器运行它 - 例如对于Vim:

:!goimports -w %

goimports页面列出了其他编辑器的一些命令,通常将其设置为在将缓冲区保存到磁盘时自动运行。

请注意,goimports也会运行gofmt

如前所述,对于变量,最简单的方法是(暂时)将它们分配给_

// No errors
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible

答案 2 :(得分:17)

你可以使用一个简单的" null函数"为此,例如:

func Use(vals ...interface{}) {
    for _, val := range vals {
        _ = val
    }
}

您可以这样使用:

package main

func main() {
    a := "declared and not used"
    b := "another declared and not used"
    c := 123

    Use(a, b, c)
}

also a package for this因此您不必每次都定义Use功能:

import (
  "github.com/lunux2008/xulu"
)

func main() {
  // [..]

  xulu.Use(a, b, c)
}

答案 3 :(得分:8)

目前尚未提到的一个角度是用于编辑代码的工具集。

使用Visual Studio Code以及名为Go的来自 lukehoban 的扩展程序将为您执行一些自动魔术。 Go扩展程序自动运行gofmtgolint等,删除并添加import条目。所以至少那部分现在是自动的。

我承认它不是100%的问题解决方案,但无论多么有用。

答案 4 :(得分:4)

2年前我在学习Go时遇到了这个问题,所以我声明了自己的功能。

// UNUSED allows unused variables to be included in Go programs
func UNUSED(x ...interface{}) {}

然后您可以像这样使用它:

UNUSED(x)
UNUSED(x, y)
UNUSED(x, y, z)

最棒的是,您可以将任何内容传递给UNUSED。

比以下更好吗?

_, _, _ = x, y, z

由您决定。

答案 5 :(得分:3)

如果其他人很难理解这一点,我认为用非常简单的术语来解释它可能会有所帮助。如果您有一个不使用的变量,例如已将调用注释掉的函数(一个常见的用例):

myFn := func () { }
// myFn()

您可以为该函数分配一个无用/空白的变量,以使其不再未使用

myFn := func () { }
_ = myFn
// myFn()

答案 6 :(得分:1)

据我所知,Go编译器中的these lines看起来像要注释掉的。您应该能够构建自己的工具链,而忽略这些适得其反的警告。

答案 7 :(得分:0)

当我想在处理代码的另一部分时暂时禁用发送电子邮件时遇到了这个问题。

评论服务的使用会引发许多级联错误,因此我没有使用条件来评论

if false {
    // Technically, svc still be used so no yelling
    _, err = svc.SendRawEmail(input) 
    Check(err)
}