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

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

在围棋中,有什么方法可以避免这种检查吗?


当前回答

2年前我在学习围棋的时候遇到了这个问题,所以我声明了自己的函数。

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

然后你可以这样使用它:

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

它最大的好处是,你可以把任何东西都变成闲置的。

它比下面的好吗?

_, _, _ = x, y, z

这取决于你。

其他回答

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

使用Visual Studio代码和lukehoban的名为Go的扩展将为你做一些自动魔术。Go扩展自动运行gofmt, golint等,并删除和添加导入项。所以至少这部分是自动的。

我承认这不是问题的100%解决方案,但无论如何足够有用。

2年前我在学习围棋的时候遇到了这个问题,所以我声明了自己的函数。

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

然后你可以这样使用它:

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

它最大的好处是,你可以把任何东西都变成闲置的。

它比下面的好吗?

_, _, _ = x, y, z

这取决于你。

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

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

你可以给函数赋值一个无用的/空白的变量,这样它就不再被使用了:

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

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

注释服务的使用会触发很多级联错误,所以我使用了一个条件而不是注释

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

根据FAQ:

Some have asked for a compiler option to turn those checks off or at least reduce them to warnings. Such an option has not been added, though, because compiler options should not affect the semantics of the language and because the Go compiler does not report warnings, only errors that prevent compilation. There are two reasons for having no warnings. First, if it's worth complaining about, it's worth fixing in the code. (And if it's not worth fixing, it's not worth mentioning.) Second, having the compiler generate warnings encourages the implementation to warn about weak cases that can make compilation noisy, masking real errors that should be fixed.

我并不一定同意这个观点,原因有很多,不值得细讲。它就是这样,而且在不久的将来不太可能改变。

对于包,有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