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