프로그래밍Go 개발자

고에서 defer가 어떻게 작동하는지 설명하고 호출 순서가 예상치 못하게 바뀔 수 있는 경우는 언제인지 설명하십시오. 실제로 어떤 함정이 있을 수 있습니까?

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

답변.

Go에서 defer 키워드는 지정된 함수의 실행을 주변 함수에서 벗어날 때까지 미룹니다. 함수는 스택에 쌓이며 역순으로 실행됩니다(LIFO). 이는 종종 리소스를 해제하는 데 사용됩니다(파일, mutex, 연결).

특징은 defer에 전달된 함수의 모든 인자는 선언 순간에 즉시 계산된다는 것입니다. 실행될 때가 아닙니다.

func test() { for i := 0; i < 3; i++ { defer fmt.Println(i) // 출력: 2, 1, 0 } }

함정이 있는 질문.

다음 코드는 무엇을 출력할까요?

func main() { for i := 0; i < 3; i++ { defer fmt.Println(i) } }

답변:

다음과 같은 결과가 출력됩니다:

2
1
0

각 사이클에서 인자 i는 즉시 계산되기 때문입니다(즉, defer 시점에) 모든 값이 defer 스택에 저장됩니다.

이 주제에 대한 미숙지로 인한 실제 오류 사례.


이야기

파일 서비스에서 defer가 정상적인 함수 종료 시에만 호출됨을 간과하여, 프로그램이 defer 호출 전에 비정상 종료될 경우 메모리 누수가 발생했습니다.


이야기

데이터 파이프라인에서 잊어버린 점은, 루프에서 연결을 닫기 위해 defer를 사용했지만, 실제로는 전체 함수가 종료된 후에야 닫혔다는 점입니다. 이로 인해 리소스가 고갈되었습니다.


이야기

로거에서 익명 함수와 함께 defer를 사용했으며, 인자가 호출 시에 계산될 것으로 예상했습니다. 이로 인해 로그의 마지막 부분에 구식 정보가 남아있게 되었고, 값이 이전에 캡처되었습니다.