>백엔드 개발 >Golang >Go에서 초기화 후 전역 오류 변수가 패닉을 일으키지 않는 이유는 무엇입니까?

Go에서 초기화 후 전역 오류 변수가 패닉을 일으키지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-11 13:51:12236검색

Why Doesn't My Global Error Variable Panic After Initialization in Go?

초기화 후 전역 오류 변수에 패닉이 발생하지 않는 이유는 무엇입니까?

전역 오류 변수를 초기화할 때 동일한 패키지 내의 함수에 변경되지 않은 것처럼 나타날 수 있습니다. 이러한 불일치는 변수 범위 지정에 대한 오해로 인해 발생합니다.

범위 지정 및 초기화

첫 번째 예에서는 :=를 사용하여 기본 함수 내에서 f와 loadErr을 모두 초기화했습니다.

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

이 줄은 f와 loadErr에 대한 새로운 지역 변수를 생성합니다. 함수 외부에 정의된 전역 변수는 수정되지 않습니다. 따라서 checkErr()을 호출하면 loadErr은 기본 함수 범위 내에서 설정되지 않았기 때문에 여전히 nil입니다.

전역 변수 설정

두 번째 예에서는 =를 사용하여 loadErr의 값을 os.Open()에서 반환된 오류로 설정합니다.

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

=를 사용하면 명시적으로 로컬 err 변수의 값을 전역 loadErr 변수에 할당합니다. 이를 통해 checkErr() 함수가 수정된 전역 변수에 액세스하고 패닉을 유발할 수 있습니다.

섀도잉 방지

실수로 전역 변수를 섀도잉하는 로컬 변수를 생성하는 것을 방지하려면 전역 변수를 선언하는 것이 중요합니다. 값을 할당하기 전에 명시적으로 첫 번째 예에서는 정의를 이동하여 기본 함수 외부에서 loadErr을 전역 변수로 선언할 수 있습니다.

var loadErr error

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

이렇게 하면 프로그램 전체에서 전역 loadErr 변수에 액세스하고 업데이트할 수 있습니다.

위 내용은 Go에서 초기화 후 전역 오류 변수가 패닉을 일으키지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.