프로그래밍Go 개발자

Go에서 Shadowing(변수 가리기)은 어떻게 작동합니까? 이 언어의 이 특성이 프로그래밍할 때 잡기 어려운 오류를 초래할 수 있는 이유는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

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 내에서는 새로운 변수 xy가 선언되며, 이들은 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은 계산을 망가트린다: 자동화된 신청 처리 시스템에서 카운터를 증가시키기 위해 = 대신 :=를 사용하여 루프 내에서 새로운 변수가 생성되거나 증가했으며, 외부 카운터는 변하지 않았습니다. 시스템은 신청서를 누락하고 중요한 통계를 낮췄습니다.