117

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

我发现这个问题非常烦人,使我无法享受 Go 中的编码。

例如,我正在测试一些代码,禁用段/功能。不再使用库中的某些功能(例如 fmt、错误等),但经过一些测试后,我需要重新启用该功能。现在,除非我删除这些导入,否则程序将无法编译,几分钟后我需要重新导入 lib。

在开发 GAE 程序时,我一次又一次地做这个过程。

4

8 回答 8

50

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

这是一个如何使用它的示例:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

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

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

于 2016-06-18T05:50:08.770 回答
30

这个var _ = fmt.Printf技巧在这里很有帮助。

于 2013-10-24T12:53:20.927 回答
26

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

如果你有兴趣,你可以在https://github.com/dtnewman/modified_golang_compiler看到这个。

现在,我可以简单地使用go run -gcflags '-unused_pkgs' test.go 之类的命令运行代码,它不会抛出这些“未使用的导入”错误。如果我省略了这些标志,那么它将返回不允许未使用的导入的默认设置。

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

于 2014-03-27T16:25:33.150 回答
20

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

于 2014-02-17T20:00:47.990 回答
7

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

于 2014-10-30T10:19:20.837 回答
5

如果您在fmt开发和测试时使用该包进行常规打印到控制台,那么您可能会在日志包中找到更好的解决方案。

于 2013-10-24T08:27:54.180 回答
2

很多人已经发表了合理的评论,我也承认原作者的意图。然而,Rob Pike 在不同的论坛中提到,Go 是一些其他主流编程语言缺乏或不易实现的过程简化的结果。这是 Go 的语言语义以及为了使编译更快,采用了很多最初看起来效率低下的东西。

简而言之,未使用的导入在 Go 中被视为错误,因为它会阻塞程序并减慢编译速度。对副作用使用导入 (_) 是一种解决方法,但是,当将有效导入与副作用以及纯粹出于调试/测试目的而导入的副作用混合在一起时,我有时会感到困惑,尤其是当代码库是很大,有机会忘记而不是无意删除,这可能会在以后混淆其他工程师/审阅者。我曾经注释掉未使用的,但是,流行的 IDE,如 VS code 和 Goland 可以goimports轻松使用,它可以很好地插入和删除导入。请参阅链接以获取更多信息,https://golang.org/doc/effective_go.html#blank_import

于 2020-06-24T15:00:04.040 回答
1

把它放在你的文档之上,忘记未使用的导入:

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
于 2014-10-30T08:48:55.933 回答