Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

global error variable remains nil after initialization

Tags:

go

When I initialize an error variable globally it seems that it's nil to another function in the same package.
I don't understand why is this code not panicing?

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

But when I do this, it seems to work as expected?

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)
    }
}
like image 272
J. Gorey Avatar asked Sep 20 '25 17:09

J. Gorey


1 Answers

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

You create a new, local variable loadErr, the global one is never set. Use just =, not :=, to use the global one.

Edit: To hold the second value too, you have to predeclare the second variable:

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

Unfortunately, you can't use := here, as := will not consider non-local variables and just create a local variable in this case.

like image 129
tkausl Avatar answered Sep 22 '25 23:09

tkausl