我正在学习Go但我觉得编译时有点烦人,我不应该留下任何变量或包未使用.
这真的让我失望了.例如,我只是想声明一个新包并计划稍后使用它或者只是取消注释一些命令来测试.我总是得到错误,需要评论所有这些用途.
Go有什么方法可以避免这种检查吗?
Flo*_*yle 199
这个错误在这里迫使你编写更好的代码,并确保使用你声明或导入的所有内容.它可以更容易地读取其他人编写的代码(您始终确保将使用所有声明的变量),并避免一些可能的死代码.
但是,如果您确实想跳过此错误,可以使用空标识符(_):
package main
import (
"fmt" // imported and not used: "fmt"
)
func main() {
i := 1 // i declared and not used
}
Run Code Online (Sandbox Code Playgroud)
变
package main
import (
_ "fmt" // no more error
)
func main() {
i := 1 // no more error
_ = i
}
Run Code Online (Sandbox Code Playgroud)
正如kostix在下面的评论中所说,你可以在FAQ中找到Go团队的官方立场:
存在未使用的变量可能表示存在错误,而未使用的导入只会减慢编译速度.在代码树中累积足够多的未使用的导入,事情会变得非常缓慢.由于这些原因,Go不允许.
Mar*_*oij 26
根据FAQ:
有些人要求使用编译器选项来关闭这些检查,或者至少将它们减少为警告.这样的选择还没有被添加,但是,因为编译器选项不会影响语言的语义,因为围棋编译器不报告警告,只是防止编译错误.
没有警告有两个原因.首先,如果它值得抱怨,那么值得在代码中修复.(如果不值得修复,则不值得一提.)其次,让编译器生成警告会鼓励实现警告可能使编译噪声的弱情况,掩盖应该修复的实际错误.
由于各种原因,我不一定同意这一点.它就是这样,它不太可能在不久的将来改变.
对于软件包,有一个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
Run Code Online (Sandbox Code Playgroud)
您应该可以从任何中途正确的编辑器运行它 - 例如对于Vim:
:!goimports -w %
Run Code Online (Sandbox Code Playgroud)
该goimports页面列出了其他编辑器的一些命令,通常将其设置为在将缓冲区保存到磁盘时自动运行.
请注意,goimports也会运行gofmt.
如前所述,对于变量,最简单的方法是(暂时)将它们分配给_:
// No errors
tasty := "ice cream"
horrible := "marmite"
// Commented out for debugging
//eat(tasty, horrible)
_, _ = tasty, horrible
Run Code Online (Sandbox Code Playgroud)
小智 22
您可以使用简单的"空函数",例如:
func Use(vals ...interface{}) {
for _, val := range vals {
_ = val
}
}
Run Code Online (Sandbox Code Playgroud)
您可以这样使用:
package main
func main() {
a := "declared and not used"
b := "another declared and not used"
c := 123
Use(a, b, c)
}
Run Code Online (Sandbox Code Playgroud)
还有一个包,所以你不必Use每次都定义函数:
import (
"github.com/lunux2008/xulu"
)
func main() {
// [..]
xulu.Use(a, b, c)
}
Run Code Online (Sandbox Code Playgroud)
chu*_*acw 12
两年前我在学习围棋时遇到了这个问题,所以我声明了自己的函数。
// UNUSED allows unused variables to be included in Go programs
func UNUSED(x ...interface{}) {}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
UNUSED(x)
UNUSED(x, y)
UNUSED(x, y, z)
Run Code Online (Sandbox Code Playgroud)
它的伟大之处在于,您可以将任何内容传递给 UNUSED。
比下面的好吗?
_, _, _ = x, y, z
Run Code Online (Sandbox Code Playgroud)
随你(由你决定。
max*_*ner 10
如果其他人很难理解这一点,我认为用非常简单的术语解释它可能会有所帮助。如果您有一个不使用的变量,例如您已注释掉调用的函数(常见用例):
myFn := func () { }
// myFn()
Run Code Online (Sandbox Code Playgroud)
您可以为函数分配一个无用/空白变量,使其不再使用:
myFn := func () { }
_ = myFn
// myFn()
Run Code Online (Sandbox Code Playgroud)
当我想在处理代码的另一部分时暂时禁用电子邮件发送时,我遇到了这个问题。
评论服务的使用引发了很多级联错误,因此我没有使用评论,而是使用了一个条件
if false {
// Technically, svc still be used so no yelling
_, err = svc.SendRawEmail(input)
Check(err)
}
Run Code Online (Sandbox Code Playgroud)
到目前为止提到的一个角度是用于编辑代码的工具集.
使用Visual Studio代码与扩展一起lukehoban叫Go会做一些自动魔术给你.转到扩展自动运行gofmt,golint等等,以及删除和添加import条目.所以至少那部分现在是自动的.
我承认它不是100%的问题解决方案,但无论多么有用.