다음은 실제 Go 프로그램을 작성할 때 defer를 사용하는 예이다.
• 파일 스트림 닫기
file, _ := os.Open(path) defer file.Close()
• 리소스 잠금 해제하기
mu.Lock() defer mu.Unlock()
• 레포트에서 푸터 출력하기
printHeader() defer printFooter()
• 데이터베이스 커넥션 닫기
con, _ := Connection() defer con.Close()
finally로 작성했을 때보다 defer로 작성했을 때가 코드의 가독성이 더 높다. 보통 특정 리소스의 사용을 해제하는 코드를 defer 구문으로 작성한다. 그리고 이때는 사용할 리소스를 초기화하는 코드와 해제하는 코드가 함께 있는 게 읽기 편하다.
다음은 함수의 시작과 끝 부분에 defer를 사용하여 트레이스 로그 출력 코드를 작성한 예이다.
▼ defer를 사용하여 트레이스 로그 출력
package main import "fmt" func enter(s string) { fmt.Println("entering:", s) } func leave(s string) { fmt.Println("leaving:", s) } func a() { enter("a") defer leave("a") fmt.Println("in a") } func b() { enter("b") defer leave("b") fmt.Println("in b") a() } func main() { b() }
실행 결과
entering: b
in b
entering: a
in a
leaving: a
leaving: b
다음과 같이 작성할 수도 있다.
▼ defer를 사용하여 트레이스 로그 출력 2
package main import "fmt" func enter(s string) string { fmt.Println("entering:", s) return s } func leave(s string) { fmt.Println("leaving:", s) } func a() { defer leave(enter("a")) fmt.Println("in a") } func b() { defer leave(enter("b")) fmt.Println("in b") a() } func main() { b() }
실행 결과
entering: b
in b
entering: a
in a
leaving: a
leaving: b