IT/GO
Go 언어 스터디 - 함수의 기능(defer)
정보산
2023. 7. 16. 13:53
728x90
defer는 함수의 기능을 지연시킵니다.
호출할 함수 앞에 defer 키워드를 사용합니다.
defer 키워드를 사용하면 함수가 종료되기 직전에 실행됩니다.
stack은 후입선출(Last In First Out) 방식입니다.
// defer: 자신을 둘러싼 함수가 종료할 때까지 어떤 함수의 실행을 연기
-------
func main() {
defer fmt.Println("Last")
defer fmt.Println("Second")
fmt.Println("First")
}
-------
//결과
$ go run ./main.go
First
Second
Last
지연된 함수 호출은 주변 함수가 반환된 후 후입선출 순서로 실행됩니다.
아래에서는 가장 마지막의 3이 출력된 후 가장 첫 0이 순서대로 출력됩니다.
func a() {
for i := 0; i < 4; i++ {
defer fmt.Println(i)
}
}
func main() {
a()
}
-------
// 결과
$ go run ./main.go
3
2
1
0
지연된 함수의 인수는 defer 문이 평가될 때 평가됩니다.
아래의 함수에서는 i++이 실행되지 않습니다. (defer 이후에 다른 실행이 없기 때문)
func b() {
i := 0
defer fmt.Println(i)
i ++
return
}
-----
// 결과
$ go run ./main.go
0
지연된 함수는 반환하는 함수의 명명된 리턴 값을 읽고 할당할 수 있습니다.
리턴값이 1로 되어 있지만, 함수가 끝나기 전에 defer를 실행하여 값을 1 증가하여 2가 결과값으로 나오게 됩니다.
이는 함수에서 종료 직전 어떠한 처리가 필요할 때 사용할 수 있습니다.
func c() (i int) {
defer func() { i++ }()
return 1
}
func main() {
fmt.Println(c())
}
-------
// 결과
$ go run ./main.go
2
728x90