如何禁用Golang未使用的导入错误

Nic*_*ick 84 go

默认情况下,将未使用的导入视为错误,强制您删除导入.我想知道是否存在改变这种行为的希望.例如将其减少为警告.

我发现这个问题非常烦人,阻止我在Go中享受编码.例如,我正在测试一些代码,禁用段/功能.不再使用lib中的某些函数(例如fmt,errors等),但是我需要在稍微测试后重新启用该函数.现在程序将无法编译,除非我删除这些导入.几分钟后,我需要重新导入lib.

在开发GAE计划时,我一次又一次地做这个过程.

Aci*_*dic 28

_在包名称前添加下划线()将忽略未使用的导入错误.

以下是如何使用它的示例:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)
Run Code Online (Sandbox Code Playgroud)

要仅为其副作用(初始化)导入包,请使用空白标识符作为显式包名.

https://golang.org/ref/spec#Import_declarations上查看更多信息

  • 不是很有用.这样做的问题是,如果您以后想再次使用导入,则必须删除`_`(否则无法引用包,因为它没有名称).如果你打算这样做,你也可以评论/取消注释.`var _ = ...`技巧没有这个问题. (5认同)
  • 与简单地注释掉相应的导入相比,这有何改进? (2认同)

Vol*_*ker 25

这个var _ = fmt.Printf诀窍很有帮助.

  • 有关详细信息,请查看此链接http://tip.golang.org/doc/effective_go.html#blank_unused (3认同)
  • 它在当下很有用,但是当我使用这种技术时,我倾向于不再回去并且稍后删除未使用的空白标识符,导致导入在我不打算长期使用它们时会留下来.使用像goimports这样的工具解决了真正的问题,并确保我的进口总是最小和干净. (2认同)

dtz*_*zvi 20

我也有同样的问题.我理解为什么他们实现该语言以禁止未使用的导入和变量的原因,但我个人觉得在编写代码时这个功能很烦人.为了解决这个问题,我改变了我的编译器,允许在我的代码中允许使用未使用的变量和导入的可选标志.

如果您有兴趣,可以在https://github.com/dtnewman/modified_golang_compiler上看到.

现在,我可以使用诸如go run -gcflags'-unused_pkgs'test.go之类的命令来运行代码,并且它不会抛出这些"未使用的导入"错误.如果我省略这些标志,则返回默认值,不允许未使用的导入.

这样做只需要进行一些简单的更改.纯粹主义者可能不会对这些变化感到满意,因为有充分的理由不允许使用未使用的变量/导入,但我个人同意你的看法,这个问题使得在Go中编码变得不那么愉快,这就是为什么我对这些变化进行了更改编译器.

  • 对于1.6版本,我也做了相同的操作,如果感兴趣,请在此处检查:https://github.com/ronelliott/go/tree/release-branch.go1.6注意:某些测试将失败 (2认同)
  • 我喜欢这背后的想法.我看到你的叉子仍然是版本1.2,这使它无用.这应该包含在标准的go编译器中,至少使得`go run main.go`在默认情况下禁用错误,而`go build`启用错误.这样就可以很容易地使用`go run`进行开发,而且当需要为生产构建时,您仍然需要清理代码. (2认同)

mdw*_*ott 15

使用goimports.它基本上是gofmt由Brad Fitzpatrick编写的一个分支,现在包含在go工具包中.您可以将编辑器配置为在保存文件时运行它.你永远不必再担心这个问题了.


Old*_*eon 5

如果您fmt在开发和测试时使用该软件包进行常规打印,那么您可以在日志包中找到更好的解决方案.

  • 或者人们似乎总是忘记的内置函数`println`. (5认同)
  • @MatrixFrog从长远来看,建立这些功能并不是一个好主意,因为它们可能会随着时间流逝而消失.使用日志是一个好主意,因为您可能会保留这些并且它是标准库的一部分,不太可能被删除.有关详细信息,请参阅[规范](http://golang.org/ref/spec#Bootstrapping). (2认同)

top*_*kip 5

使用if false { ... }注释掉一些代码。大括号内的代码必须在语法上正确,否则可能是无意义的代码。

  • 不仅仅是语法正确,任何引用的变量(例如 foo.Bar)都必须存在,等等。 (3认同)