본문 바로가기
Language/Golang

Golang defer (지연 호출)

by 돈코츠라멘 2019. 9. 7.

지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능이다. Java에서의 try, catch, finally 구문에서 finally와 유사한 동작을 한다.

func hello() {
    fmt.Println("Hello")
}

func world() {
    fmt.Println("World")
}

func main() {
    defer world() // world 함수가 나중에 호출된다.
    hello()
    hello()
}
Hello
Hello
World

지연 호출할 함수는 여러 개를 선언해도 되며, 이때 실행되는 순서는 LIFO이다. 따라서 맨 나중에 호출한 함수가 먼저 실행된다.

func hello() {
    fmt.Println("Hello")
}

func world() {
    fmt.Println("World")
}

func main() {
    defer hello() // 나중에 실행
    defer world() // 먼저 실행
    hello()
    hello()
}
Hello
Hello
World
Hello

일반적으로 Clean-up 작업을 위해 사용되며, 가장 많이 사용되는 케이스는 파일 입출력이다. 아래와 같이 파일을 연 뒤 지연 호출로 close를 호출하면 함수가 끝날 때 무조건 파일을 닫는다. 이런 방식은 특히 프로그램 흐름상 분기가 많아 에러 처리가 중복해서 나타날 때 유용하다.

func main() {
    file, _ := os.Create("data.txt")
    defer file.Close()
    fmt.Fprint(file, 1, 1.1, "Hello, world!")
}

'Language > Golang' 카테고리의 다른 글

Golang panic(패닉)과 recover(복구): Java에서의 try-catch 구문  (0) 2019.09.10
Golang Closure  (0) 2019.09.06
Golang first-class function (일급함수)  (0) 2019.09.03
Golang 함수  (0) 2019.09.03

댓글