3

我一直在编写一个测试程序来帮助学习围棋。这样做时,我遇到了一些我认为编译器应该检测到错误的情况。我遇到过另一个类似的情况,所以我想我应该问为什么这种情况不被视为错误。

示例情况:

if oError = rwfile.WriteLines(asParams, sParamsFilename); oError != nil {
    fmt.Printf("Error on write to file Params. Error = %s\n", oError)
} else {
    println("Params file write OK")
}

在上面的例子中,无论变量“oError”是否被声明,编译器都不会指出错误。如果在未声明变量时(如预期的那样)该行包含以下内容,它也可以工作:

if oError := rwfile.WriteLines(asParams, sParamsFilename); oError != nil {

如果我声明变量“oError”,那么“:=”不起作用(如预期的那样)。

“rwfile”是我写的一个包,有问题的函数开头如下:

func WriteLines(asBuff []string, sFilename string) error { // write text file

如果我在写入文件时创建错误,并使用“=”而不声明变量“oError”,则程序可以正常工作并检测到非零“oError”变量。

那么,当 oError 未声明为变量时,为什么上面使用“=”不被视为错误?

Go 版本是 go1.1.2 Windows/386。

4

2 回答 2

8

这意味着您oError在包中的其他位置有一个变量。(请注意,此变量不必在同一个文件中;它可以在具有相同包子句的不同文件中。)因此,当您使用 时oError = ...,您正在为该包变量分配一个值,而当您使用 时oError := ...,您'正在声明一个隐藏包变量的局部变量。(根据规范,“在块中声明的标识符可以在内部块中重新声明。虽然内部声明的标识符在范围内,但它表示由内部声明声明的实体。” [链接])

如果您尝试不同的标识符,一个唯一的标识符,您应该会看到编译器确实在抱怨。

于 2013-10-13T05:28:54.337 回答
2

它与实际问题无关,但 `go fmt` 确实可以帮助跟踪大程序中的错误内容。

此外,遵循样式指南确实很有帮助:使用简洁的代码样式(没有匈牙利变量名!我花了很长时间才习惯短名称)和短文件:2Kloc 文件可能太大了。非常值得浏览标准库源代码,看看好的 Go 代码是什么样的

于 2013-10-14T04:17:35.717 回答