go - 为什么 Go 编译器不将未声明的变量视为错误?

标签 go

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

示例情况:

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。

最佳答案

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

如果您尝试使用不同的标识符,一个唯一的标识符,您应该会看到编译器确实会报错。

关于go - 为什么 Go 编译器不将未声明的变量视为错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341877/

相关文章:

go - 使用gcc而不是g++构建golang

pointers - Golang 处理 nil 指针异常

rest - 如何从 goREST POST 端点返回消息?

Golang 无法将文件写入目录

go - 无法从 GitHub 下载 Go 包

regex - 转义字符串特殊字符以在 golang 正则表达式中使用

go - 需要更新版本

json - golang GET请求运行时json类型错误

go - 如何使用 golang 接受付款?

for-loop - For loop Increment with a step 不起作用