我正在学习Go,但感到有点烦人,在编译时,我不应该保留任何变量或包。
这确实让我放慢了脚步。例如,我只想声明一个新软件包并计划以后使用它,或者只是取消注释某些命令以进行测试。我总是会收到错误,需要对所有这些用法进行评论。
Go中有什么方法可以避免这种检查吗?
我正在学习Go,但感到有点烦人,在编译时,我不应该保留任何变量或包。
这确实让我放慢了脚步。例如,我只想声明一个新软件包并计划以后使用它,或者只是取消注释某些命令以进行测试。我总是会收到错误,需要对所有这些用法进行评论。
Go中有什么方法可以避免这种检查吗?
Answers:
该错误将迫使您编写更好的代码,并确保使用声明或导入的所有内容。它使阅读他人编写的代码更加容易(您始终可以确保将使用所有已声明的变量),并避免了一些可能的无效代码。
但是,如果您确实想跳过此错误,则可以使用空白标识符(_
):
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小组的正式职位:
未使用的变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度。在代码树中积累足够的未使用导入,事情可能会变得很慢。由于这些原因,Go都不允许。
您可以为此使用一个简单的“空函数”,例如:
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)
}
根据常见问题解答:
有些人要求使用编译器选项来关闭这些检查或至少将其减少为警告。但是,由于编译器选项不应影响语言的语义,并且因为Go编译器不报告警告,因此仅添加阻止编译的错误,因此未添加该选项。
没有警告有两个原因。首先,如果值得抱怨,则值得在代码中进行修复。(并且,如果不值得修复,就不值得一提。)其次,让编译器生成警告会鼓励实现对可能会使编译产生噪音的弱情况发出警告,从而掩盖了应修复的实际错误。
出于各种原因,我不一定同意这一点。就是这样,在不久的将来它不可能改变。
对于软件包,有一个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
到目前为止尚未提及的一个角度是用于编辑代码的工具集。
使用Visual Studio代码与扩展一起lukehoban叫Go
会做一些自动魔术给你。转到扩展自动运行gofmt
,golint
等等,以及移除并添加import
条目。因此,至少该部分现在是自动的。
我将承认它不是100%解决该问题的方法,但是足够有用。