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

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

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


当前回答

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

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

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

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

其他回答

你可以使用一个简单的“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)
}

这里还有一个包,所以你不必每次都定义Use函数:

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

func main() {
  // [..]

  xulu.Use(a, b, c)
}

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

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

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

这个错误迫使您编写更好的代码,并确保使用您声明或导入的所有内容。它使阅读其他人编写的代码更容易(您总是可以确定所有声明的变量都将被使用),并避免一些可能的死代码。

但是,如果你真的想跳过这个错误,你可以使用空白标识符(_):

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在下面的评论中所说,你可以在FAQ中找到Go团队的官方立场:

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

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

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

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

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

根据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