개발/Developing

Golang의 defer의 변수 캡쳐, 그리고 동작 원리

lazykuna 2023. 4. 2. 00:40

https://www.redbubble.com/i/sticker/Go-Drunk-for-who-loves-go-for-everything-by-clgtart/28531596.EJUG5

위스키 먹고 제정신은 아니지만 그래도 대충 후딱 정리해 둔다...

Golang에서 defer은 일종의 일차함수를 인자로 받는 구조로 되어 있는데, 형태가 다소 재미있다. 마치 `defer func(params) { body }(params)` 형태로 되어 있다. 그래도 말 그대로 defer이니 만큼, 이 함수는 함수가 끝나는 제일 마지막에 실행된다. 그런데 몇 가지 특이사항이 있어서 정리해 둔다.

  1. defer은 나중에 선언된 순으로 가장 일찍 실행된다.
  2. defer이 variable들을 capture 하는 시점은 함수의 수행이 끝나는 시점이다. 어렵게 생각할 것 없이, Defer이 수행될 때 변수의 값을 사용한다고 보면 된다.
  3. defer에 넘겨주는 인자(parameter)는 capture 되지 않는다. 어떻게 보면 당연하다

출처: https://stackoverflow.com/questions/16010694/how-golangs-defer-capture-closures-parameter