2017-03-14 65 views
1

後,當我初始化錯誤全局變量來似乎是無以同樣包裝的另一個功能。
我不明白這是爲什麼不代碼panicing?Golang全局錯誤變量保持零初始化

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

回答

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

您創建一個新的本地變量loadErr,全球一個從未設置。只使用=,而不是:=,以使用全局。

編輯:舉辦第二屆太超值了,你必須預先聲明第二個變量:

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

不幸的是,你不能使用:=這裏,作爲:=不會考慮非本地變量,只創建在這種情況下是局部變量。

+0

我編輯我的問題更清晰。我最終必須使用:=,因爲在現實生活中的情況下,我需要持有˚F以及 –

+1

@ J.Gorey所以你有什麼問題嗎?你正在創建一個局部變量來影響全局變量。 – zerkms

2

short variable declaration創造了新的變數,如果左邊的變量都在外部scope被宣佈。 也是如此,如果不是所有的變量是新的左側,否則會重複聲明(不引入新的變量,它只是一個新的值賦給原件)。

所以,如果你想要的值分配給全局變量,不要使用短變量聲明,但簡單assignment。當然,對於一個變量已經早些時候宣佈的元組分配,您必須聲明另一個太前:

var f *os.File 
f, loadErr = os.Open("asdasd") 
if loadErr != nil { 
    // Handle error 
} 

你可以寫它更緊湊:

var f *os.File 
if f, loadErr = os.Open("asdasd"); loadErr != nil { 
    // Handle error 
} 

也有另一種選擇使用短變量聲明,但你必須「手動」誤差值分配給全局變量loadErr

f, err := os.Open("asdasd") 
loadErr = err 
if err != nil { 
    // Handle error 
} 

或者更緊湊:

f, err := os.Open("asdasd") 
if loadErr = err; err != nil { 
    // Handle error 
} 

查看有關/可能重複的問題:How to use global var across files in a package?