golang - defer

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

defer

테스트

테스트 1: 마지막으로 쓴 것이

  • 가장 뒤에 쓴 것이 제일 처음 호출된다
  • http://play.golang.org/p/gb8tbGk4wr
package main

import "fmt"

func f() {
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
}

func main() {
    f()
}

테스트 2: 인수 평가

  • 인수의 평가는 defer 함수 호출이 예약될 때 행해진다.
  • http://play.golang.org/p/-MPMro0vUy
package main

import "fmt"

func f() {
    i := 0
    defer fmt.Printf("i is %d", i)
    i = 100
}

func main() {
    f()
}
  • http://play.golang.org/p/FXKl3S4mi0
package main

import "fmt"

func f() (ret int) {
    defer func(n int) {
        fmt.Println(n)
        fmt.Println(ret)
    }(ret) //ret은 제로 값으로 초기화 되어 있다

    return 100
}

func main() {
    fmt.Println(f())
}

테스트 3: 메소드 객체라도

  • 메소드 객체라도 defer 호출을 할 수 있다.
  • http://play.golang.org/p/ewH2vlyWsL
package main

import "fmt"

type Hoge struct {
    N int
}

func (h *Hoge) PrintN() {
    fmt.Println(h.N)
}

func f() {
    h := &Hoge{100}
    m := h.PrintN
    defer m()
    h.N = 200
}

func main() {
    f()
}

defer 틀리게 사용한 경우

틀린 코드 1

func ng() {
    c := 0
    defer fmt.Println("ng", "c=", c)
    for i := 0; i < 10; i++ {
        c++
    }
}
ng c= 0

틀린 코드 2

for 때와 같은 느낌으로 함수를 받는 형태로도 안된다.

func ng2() {
    c := 0
    defer func(n int){fmt.Println("ng", "c=", n)}(c)
    for i := 0; i < 10; i++ {
        c++
    }
}

scope 문제가 아니므로 아래와 같이 출력

ng c= 0

올바른 코드

func ok() {
    c := 0
    defer func(n *int) { fmt.Println("ok", "c=", *n) }(&c)
    for i := 0; i < 10; i++ {
        c++
    }
}
ok c= 10

이 글은 2018-10-29에 작성되었습니다.