首页 >后端开发 >Golang >为什么我的全局错误变量在 Go 中初始化后仍然为 Nil?

为什么我的全局错误变量在 Go 中初始化后仍然为 Nil?

Barbara Streisand
Barbara Streisand原创
2024-12-13 08:04:10814浏览

Why Does My Global Error Variable Remain Nil After Initialization in Go?

全局错误变量在初始化后保持为零:发现差异

考虑以下代码:

package main

import (
    "os"
    "fmt"
)

var loadErr error

func main() {
    f, loadErr := os.Open("asdasd")
    if loadErr != nil {
        checkErr()
    }
    if f != nil {
        fmt.Println(f.Name())
    }
}

// panic won't be called because loadErr is nil
func checkErr() {
    if loadErr != nil {
        panic(loadErr)
    }
}

令人困惑,即使 loadErr 为 nil,此代码也不会出现恐慌。当 loadErr 不为零时,相同的函数 checkErr() 被定义为恐慌。是什么导致了这种差异?

谜底揭开

问题的根源在于局部变量和全局变量之间的微妙区别。在第一个代码片段中,行:

f, loadErr := os.Open("asdasd")

在 main 函数的范围内创建一个新的本地 loadErr 变量。此局部变量与在任何函数外部声明的全局 loadErr 不同。因此,在整个代码执行过程中,全局 loadErr 保持不变且为 nil。

解决差异

纠正问题并确保全局 loadErr设置,将上面提到的行中的 := 替换为 =:

func main() {
    _, = os.Open("asdasd")

此更改将 os.Open() 的值直接分配给全局 loadErr,从而将其正确设置为所需的值。

附加说明

如果您希望保留同样是 f 的值,在函数作用域之外预先声明 f:

var f *os.File

func main() {
    f, = os.Open("asdasd")

在这种情况下使用 := 会创建一个局部 f 变量,使全局变量黯然失色。

以上是为什么我的全局错误变量在 Go 中初始化后仍然为 Nil?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn