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
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()
}
os.Open으로 파일을 연 뒤 지연 호출로 file.Close를 호출하면 함수가 끝날 때 무조건 file.Close로 파일을 닫는다. 파일 열기는 성공했지만 중간에 file.Read에서 실패하더라도 지연 호출을 사용했으므로 함수가 종료될 때 file.Close로 파일을 닫는다 특히 이런 방식은 프로그램 흐름상 분기가 많아 에러 처리가 복잡해질때 유용하다