초기화 후 전역 오류 변수가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!