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에 작성되었습니다.