默认情况下,Go 将未使用的导入视为错误,强制您删除导入。我想知道是否存在改变这种行为的希望,例如将其减少为警告。
我发现这个问题非常烦人,使我无法享受 Go 中的编码。
例如,我正在测试一些代码,禁用段/功能。不再使用库中的某些功能(例如 fmt、错误等),但经过一些测试后,我需要重新启用该功能。现在,除非我删除这些导入,否则程序将无法编译,几分钟后我需要重新导入 lib。
在开发 GAE 程序时,我一次又一次地做这个过程。
默认情况下,Go 将未使用的导入视为错误,强制您删除导入。我想知道是否存在改变这种行为的希望,例如将其减少为警告。
我发现这个问题非常烦人,使我无法享受 Go 中的编码。
例如,我正在测试一些代码,禁用段/功能。不再使用库中的某些功能(例如 fmt、错误等),但经过一些测试后,我需要重新启用该功能。现在,除非我删除这些导入,否则程序将无法编译,几分钟后我需要重新导入 lib。
在开发 GAE 程序时,我一次又一次地做这个过程。
_
在包名称前添加下划线 ( ) 将忽略未使用的导入错误。
这是一个如何使用它的示例:
import (
"log"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
要仅为其副作用(初始化)导入包,请使用空白标识符作为显式包名称。
这个var _ = fmt.Printf
技巧在这里很有帮助。
我也有同样的问题。我理解他们实现语言以禁止未使用的导入和变量的原因,但我个人在编写代码时发现此功能很烦人。为了解决这个问题,我改变了我的编译器,允许在我的代码中允许未使用的变量和导入的可选标志。
如果你有兴趣,你可以在https://github.com/dtnewman/modified_golang_compiler看到这个。
现在,我可以简单地使用go run -gcflags '-unused_pkgs' test.go 之类的命令运行代码,它不会抛出这些“未使用的导入”错误。如果我省略了这些标志,那么它将返回不允许未使用的导入的默认设置。
这样做只需要一些简单的更改。Go 纯粹主义者可能不会对这些更改感到满意,因为有充分的理由不允许未使用的变量/导入,但我个人同意你的观点,这个问题使在 Go 中编码变得不那么愉快,这就是为什么我对我的编译器。
使用goimports。它基本上是一个分支gofmt
,由 Brad Fitzpatrick 编写,现在包含在 go 工具包中。您可以将编辑器配置为在保存文件时运行它。你再也不用担心这个问题了。
用于注释掉if false { ... }
一些代码。大括号内的代码必须在语法上正确,否则可能是无意义的代码。
如果您在fmt
开发和测试时使用该包进行常规打印到控制台,那么您可能会在日志包中找到更好的解决方案。
很多人已经发表了合理的评论,我也承认原作者的意图。然而,Rob Pike 在不同的论坛中提到,Go 是一些其他主流编程语言缺乏或不易实现的过程简化的结果。这是 Go 的语言语义以及为了使编译更快,采用了很多最初看起来效率低下的东西。
简而言之,未使用的导入在 Go 中被视为错误,因为它会阻塞程序并减慢编译速度。对副作用使用导入 (_) 是一种解决方法,但是,当将有效导入与副作用以及纯粹出于调试/测试目的而导入的副作用混合在一起时,我有时会感到困惑,尤其是当代码库是很大,有机会忘记而不是无意删除,这可能会在以后混淆其他工程师/审阅者。我曾经注释掉未使用的,但是,流行的 IDE,如 VS code 和 Goland 可以goimports
轻松使用,它可以很好地插入和删除导入。请参阅链接以获取更多信息,https://golang.org/doc/effective_go.html#blank_import
把它放在你的文档之上,忘记未使用的导入:
import (
"bufio"
"fmt"
"os"
"path/filepath"
)
var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs