저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
지연 호출 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능입니다. 다른 언어의 try finally 구문과 비슷하게 동작하지만 문법이 좀 더 간단합니다.
- defer 함수명()
- defer 함수명(매개변수)
package main
import "fmt"
func hello() {
fmt.Println("Hello")
}
func world() {
fmt.Println("world")
}
func main() {
//↓ 함수의 호출이 지연됨.
defer world() // 현재 함수(main())가 끝나기 직전에 호출
hello()
hello()
hello()
}
실행 결과
Hello
Hello
Hello
world
여기서 hello 함수보다 world 함수를 먼저 호출했더라도 출력을 해보면 world 함수가 나중에 호출됩니다. 즉 defer
를 사용한 함수는 현재 함수(main())가 끝나기 직전에 호출되므로 다른 함수들 보다 맨 마지막에 호출됩니다.
다음은 함수 안에 익명 함수를 선언 및 정의하고 지연 호출을 합니다.
func HelloWorld() {
//↓ HelloWorld() 함수가 끝나기 직전에 호출
defer func() {
fmt.Println("world")
}()
func() {
fmt.Println("Hello")
}()
}
func main() {
HelloWorld()
}
실행 결과
Hello
world
지연 호출한 함수가 실행되는 순서는 자료구조의 스택(LIFO)과 동일합니다. 따라서 맨 나중에 지연 호출한 함수가 먼저 실행됩니다.
func main() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
실행 결과
4 3 2 1 0
지연 호출은 파일을 열고 닫을 때 유용하게 활용할 수 있습니다.
hello.txt
Hello, world!
package main
import (
"fmt"
"os"
)
func ReadHello() {
file, err := os.Open("hello.txt")
defer file.Close() // 지연 호출한 file.Close()가 맨 마지막에 호출됨
if err != nil {
fmt.Println(err)
return // file.Close() 호출
}
buf := make([]byte, 100)
if _, err = file.Read(buf); err != nil {
fmt.Println(err)
return // file.Close() 호출
}
fmt.Println(string(buf))
// file.Close() 호출
}
func main() {
ReadHello()
}
실행 결과
Hello, world!
os.Open으로 파일을 연 뒤 지연 호출로 file.Close를 호출하면 함수가 끝날 때 무조건 file.Close로 파일을 닫습니다. 파일 열기는 성공했지만 중간에 file.Read에서 실패하더라도 지연 호출을 사용했으므로 함수가 종료될 때 file.Close로 파일을 닫습니다. 특히 이런 방식은 프로그램 흐름상 분기가 많아 에러 처리가 복잡해질때 유용합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.