Go语言的警告和错误

13

看起来GO语言中没有警告信息。从我的观察中得出以下几点: 1. "声明但未使用"(如果变量被声明但在任何地方都未被使用,则会产生错误并使程序无法编译) 2. "导入但未使用"(同样,如果包被导入但在任何地方都未被使用,则会产生错误并使程序无法编译) 能否有人提供帮助?如果他们有任何要点,请指教。


1
你只需要修复那些错误,然后编译即可。Golang在未使用的内容方面非常严格 - 这很棒。 - Alex Plugaru
3
请注意,语言 定义了什么是合法的,什么是不合法的,因此一种语言只能定义“错误”。另一方面,“警告”来自 编译器 而不是语言本身。 - Ray Toal
非常感谢您的评论。但我想知道是否有类似警告的东西。 - Anuj Verma
http://golang.org/cmd/vet/ 会给你一些警告。 - Paul Hankin
4个回答

22

Go试图避免这种情况:

男孩在吸烟并在空气中吐烟圈,女孩因为烟雾而感到恼怒,对她的爱人说:"你看不见香烟盒上写的警告吗?吸烟有害健康!"

男孩回答道:"亲爱的,我是一名程序员。我们不关心警告,我们只关心错误。"

基本上,Go编程语言不会让你轻易地放过未使用的变量、未使用的导入以及其他通常是其他语言中的警告的内容。它帮助养成良好的习惯。


17
它不能防止坏习惯。它培养了另一种不好的习惯。他们会写成 import unusedfoo;func a(x unusedfoo.bar){};...,而不是 import unusedfoo //仅用于调试.. - Elazar Leibovich
1
如果有人想编写一个函数来代替仅仅注释或删除导入语句,那么编译器实际上无能为力。他们只会找到另一种方法。 - elithrar
1
@elithrar 当然有办法,以“宽容”模式编译你的代码,在发布之前切换到生产模式(在C/C++世界中称为-Wall -Werror)。这样你就可以确保不会忘记任何未使用的语句。 - Elazar Leibovich
@AnujVerma 正确,如果你吸一口烟,你就会立即死亡。 - Chas. Owens
1
作为程序员,如果你不关心警告,那就是一个坏习惯。我不明白这种严格的要求有什么意义。程序员的日常工作就是摆弄、创建和删除变量,创建代码并暂时禁用它。理想情况下,即使一个测试有编译时错误,也应该能够运行另一个测试。其他一切都是毫无意义和烦人的,会妨碍程序员的日常工作。此外,还有代码审查,可以再次检查所有警告。 - NotX
显示剩余2条评论

15

Go语言FAQ

我能否停止编译器对未使用的变量和导入包的警告?

未使用的变量可能指示存在错误,而未使用的导入包只会减慢编译速度。如果在代码中累积了足够多的未使用的导入包,编译速度会变得非常缓慢。因此,Go语言不允许它们存在。

在开发代码时,暂时创建这些情况是很常见的,但在程序编译之前将其删除可能令人烦恼。

有些人要求添加编译器选项以关闭这些检查或者将其降低为警告级别。但是,这样的选项并没有被添加,因为编译器选项不应影响语言的语义,而且Go语言编译器不报告警告,只报告阻止编译的错误。

没有警告的原因有两个。首先,如果值得抱怨,就值得在代码中修复。(如果不值得修复,那么也不值得提及)。其次,让编译器生成警告会鼓励实现方警告那些可能会使编译变得嘈杂的弱情况,掩盖了应该修复的真正错误。

不过,解决这个问题很容易。使用空白标识符,让未使用的变量或导入包在开发时继续存在即可。

import "unused"

// This declaration marks the import as used by referencing an
// item from the package.
var _ = unused.Item  // TODO: Delete before committing!

func main() {
    debugData := debug.Profile()
    _ = debugData // Used only during debugging.
    ....
}

链接已失效。它被移动了吗? - Steven Roose
Steven Roose:是的,它已经移动了。修复了链接并更新了内容。 - peterSO
或者,就像我一样,你最终会在项目目录中留下“test1.go”,“test2.go”等文件,以便在不必到处散布无操作的情况下测试某些内容。 :( - Xiong Chiamiov
2
这是一个弱点,无论他们怎样在文档中解释。语言的目的是提高程序员的生产力。必须注释掉测试代码中使用的程序包以及所有测试变量的所有实例,而不仅仅是更改编译器上的标志,显然会降低程序员的生产力。 - mikekehrli

1

对于未使用的导入,一种解决方案是使用goimports,它是gofmt的一个分支。它会自动添加缺失的导入并删除未使用的导入(另外还能格式化您的代码)。

http://godoc.org/code.google.com/p/go.tools/cmd/goimports

我已经配置了我的编辑器,在保存代码时自动运行goimports。现在,我无法想象写go代码时没有它。

0

根据我刚刚阅读的(维基百科),“Go的语法包括了从C语言中针对代码简洁和易读性的改变。”

“简洁”这个词对编译器来说非常重要。我发现编译器强制执行的语法不再是“\n”或空格不敏感的了。而且也没有“警告”类型的错误。

Go有好的地方,也有不太好的地方。不发出警告的态度有点极端,特别是在开发或测试新软件包时。似乎部分开发是不可接受的。警告也是不可接受的。只能是生产版本或者放弃。这是一种非常二元的观点。我想知道如果自然界受到这样的限制,进化是否会导致“生命”的出现。

我只能希望事情会改变。有时候死亡似乎非常有益。我尝试过Go,但我很失望。在我这个年龄,我不认为我会回头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接