-
🏃♂️ Golang - defer 키워드| 프로그래밍 분야/Go 2021. 10. 21. 23:03
defer?
Golang의 특징적인 키워드 중 하나로 defer 가 있어요
defer 는 defer 를 포함한 함수가 반환되기 직전에 명령을 수행하도록 하는 예약 키워드에요
// Contents returns the file's contents as a string. func Contents(filename string) (string, error) { f, err := os.Open(filename) if err != nil { return "", err } defer f.Close() // f.Close will run when we're finished. var result []byte buf := make([]byte, 100) for { n, err := f.Read(buf[0:]) result = append(result, buf[0:n]...) // append is discussed later. if err != nil { if err == io.EOF { break } return "", err // f will be closed if we return here. } } return string(result), nil // f will be closed if we return here. }
위의 예시는 Open했던 파일을 defer 키워드를 통해 Close 예약을 걸어준 상황이에요
위와 같이 Close 를 예약해주면 다음 두 가지 장점이 생겨요
- 파일을 닫는 것을 잊어버리는 실수 예방
- open 근처에 close가 위치하면 함수 맨 끝에 위치하는 것보다 코드가 명확해져요
또한 defer 키워드는 다음과 같은 특징들이 있어요
실행 순서 - LIFO
defer 키워드를 통해 예약된 함수들은 LIFO 순서에 의해 실행돼요
for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) }
[실행 결과]
4 3 2 1 0
매개변수 함수 즉각 처리
함수의 매개변수로 주어지는 함수는 지연되지 않고 바로 실행돼요
func trace(s string) string { fmt.Println("entering:", s) return s } func un(s string) { fmt.Println("leaving:", s) } func b() { defer un(trace("b")) fmt.Println("in b") } func main() { b() }
[실행 결과]
entering: b
in b
leaving: b