Go 배우는 중인데 defer가 편해서 여러 개 막 걸어놨거든요. 근데 실행 순서가 제가 예상한 거랑 반대로 나와서 헷갈립니다.


이렇게 테스트해봤어요.


func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
fmt.Println("본문 끝")
}


저는 당연히 "본문 끝" 다음에 1, 2, 3 순서로 나올 줄 알았는데 실제로는 3, 2, 1로 나오더라고요. 먼저 건 게 나중에 실행되는 것 같은데 맞나요? 스택처럼 쌓였다가 거꾸로 나오는 개념인 건지 궁금해요.


그리고 반복문 안에서 defer를 걸면 어떻게 되나요? 파일 여러 개 열면서 defer f.Close()를 루프 안에 넣었는데, 이게 반복마다 바로 닫히는 게 아니라 함수 끝날 때 한꺼번에 닫히는 거라 파일이 계속 열려 있게 되는 건지 걱정되네요. 이럴 땐 어떻게 처리하는 게 맞나요?