Today
-
Yesterday
-
Total
-
  • 🏃‍♂️ 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

     

    출처 : https://golang.org/doc/effective_go

sangilyoon.dev@gmail.com