더북(TheBook)

다음은 실제 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

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.