2.4.3 defer
defer 키워드는 함수가 종료되기 전까지 특정 구문의 실행을 지연시켰다가, 함수가 종료되기 직전에 지연시켰던 구문을 수행한다. 자바나 C#의 finally 같은 개념이다. 주로 리소스를 해제시키거나 클렌징 작업이 필요할 때 사용한다.
다음 예제는 defer의 동작 방식을 보여준다.
▼ defer 사용 예제
package main import "fmt" func main() { f1() } func f1() { fmt.Println("f1 - start") defer f2() fmt.Println("f1 - end") } func f2() { fmt.Printf("f2 - deferred") }
실행 결과
f1 - start
f1 - end
f2 - deferred
defer 키워드를 제거한 예제와 결과를 비교해 보면 defer의 동작 방식을 명확히 이해할 수 있을 것이다.
함수 하나에 defer 키워드를 여러 개 사용하면 defer로 지정한 각 구문은 스택(stack)에 쌓였다가 가장 나중에 쌓인 defer 구문부터 수행된다.
▼ defer를 여러 개 사용
package main import "fmt" func f() { for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } } func main() { f() }
실행 결과
4 3 2 1 0