go - 全局错误变量在初始化后保持为 nil

标签 go

当我全局初始化一个错误变量时,它似乎对同一个包中的另一个函数是 nil。
我不明白为什么这段代码没有 panic ?

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)
    }
}

但是当我这样做时,它似乎按预期工作?

package main

import (
    "os"
)

var loadErr error

func main() {
    _, err := os.Open("asdasd")
    loadErr = err
    if loadErr != nil {
        checkErr()
    }
}

// panic will be called as expected
func checkErr() {
    if loadErr != nil {
        panic(loadErr)
    }
}

最佳答案

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

您创建了一个新的本地 变量loadErr,但从未设置全局变量。仅使用 =,而不是 :=,以使用全局代码。

编辑:要保存第二个值,您必须预先声明第二个变量:

var f *os.File
f, loadErr = os.Open("asdasd")

不幸的是,你不能在这里使用 :=,因为 := 不会考虑非局部变量,在这种情况下只会创建一个局部变量。

关于go - 全局错误变量在初始化后保持为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42780555/

相关文章:

function - 需要GoLang函数声明解释

go - 无法将 interface{} 直接转换为 []map[string]interface{}

go - 无法加载 github.com/open-policy-agent/opa/capability : no Go source files

go - 在 GO 中重用数据库连接和 'invalid memory address' 错误

http - 获取 https ://<mydomain. com>/translate/2327496366232: x509: 证书由未知权威签署”

go - 每次请求后关闭 http2 客户端连接

google-app-engine - memcache 是否在 go on appengine 中工作?

google-app-engine - 为什么 GAE go runtime 1.11 max concurrent requests 不起作用?

performance - scala Play 2.5 与 golang 基准测试,以及优化 play 框架的性能

eclipse - 如何使用 GoClipse 在 Eclipse Neon 中创建断点?