> 백엔드 개발 > Golang > Go에서 초기화한 후 전역 오류 변수가 Nil로 유지되는 이유는 무엇입니까?

Go에서 초기화한 후 전역 오류 변수가 Nil로 유지되는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-13 08:04:10
원래의
815명이 탐색했습니다.

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

초기화 후 전역 오류 변수가 Nil로 유지됨: 불일치 발견

다음 코드를 고려하세요.

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이 nil이 아닐 때 패닉을 일으키도록 동일한 함수 checkErr()이 정의되어 있습니다. 이러한 불일치의 원인은 무엇입니까?

The Mystery Unveiled

문제의 근본 원인은 로컬 변수와 전역 변수 간의 미묘한 차이에 있습니다. 첫 번째 코드 조각에서:

f, loadErr := os.Open("asdasd")
로그인 후 복사

행은 기본 함수 범위 내에서 새로운 로컬 loadErr 변수를 생성합니다. 이 지역 변수는 함수 외부에서 선언된 전역 loadErr과 다릅니다. 결과적으로 전역 loadErr은 코드 실행 전반에 걸쳐 그대로 유지되며 0으로 유지됩니다.

불일치 해결

문제를 수정하고 전역 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿