Shadowing(가리기)은 내부 범위에서 변수가 같은 이름의 외부 범위 변수를 숨기거나("가리기") 하는 것을 의미합니다. Go에서는 변수 선언 블록 :=의 특징 덕분에 가능합니다. 특히 블록(if, for, switch 등) 내에서 가능합니다.
x := 5 if true { x := 10 // 이 x는 새로운 변수로, 이 if 내에서만 작동합니다. fmt.Println(x) // 10 } fmt.Println(x) // 5, 아닌 10
때때로 유용할 수 있지만, 다시 선언된 변수가 외부의 동일한 변수가 아니라는 것을 잊으면 오류로 이어질 수 있습니다.
질문: "다음 코드는 무엇을 출력할까요?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
답변:
if 내에서는 새로운 변수 x와 y가 선언되며, 이들은 if 블록 내에서만 접근 가능합니다.x는 여전히 외부 변수이며, 그 값은 변하지 않습니다.결과:
1 2
7
이야기
Shadowing err로 인한 리소스 누수: 파일 작업 중 오류 변수를 가리는 일반적인 실수입니다.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // 이 err는 새로운 변수입니다!
연산자 :=는 블록 내에서만 새로운 변수 err를 생성하며, 외부 변수 err는 변하지 않습니다. 외부 변수에서 오류 처리를 기대할 경우, 오류 정보가 손실될 수 있습니다.
이야기
구조체의 Shadowing - 보이지 않는 버그: 내부 블록에서 개발자는 동일한 이름의 구조체를 재정의했습니다. 이로 인해 일부 로직은 내부 버전과 작업하고, 다른 부분은 외부 버전과 작업하여 이상한 버그와 데이터 손실이 발생했습니다.
이야기
루프에서의 Shadowing은 계산을 망가트린다:
자동화된 신청 처리 시스템에서 카운터를 증가시키기 위해 = 대신 :=를 사용하여 루프 내에서 새로운 변수가 생성되거나 증가했으며, 외부 카운터는 변하지 않았습니다. 시스템은 신청서를 누락하고 중요한 통계를 낮췄습니다.