쿼카러버의 기술 블로그

[golang] Closure(클로저)란? 본문

[Golang]

[golang] Closure(클로저)란?

quokkalover 2021. 8. 2. 08:54

함수 리터럴 외부 변수를 내부 상태로 가져오는 것을 클로저라고 한다.

값 복사가 아닌 참조 형태로 가져오기 때문에, 값 변경에 주의해야 한다. 

 

참조형태로 가져온다는 것은 외부 변수 a를 캡쳐할 때 a의 주솟값을 포인터 형태로 가져와 나중에 메모리 주솟값을 통해 a에 접근한다는 것을 의미한다.

따라서 함수 리터럴이 여러 고루틴에서 실행될 때 이 특성을 꼭 주의해서 사용해야  한다. 

 

아래 예시를 통해서 v값을 사용하는 내부 함수 리터럴들의 출력 결과를 보면 이해에 도움이 될 것이다.

package main

import (
	"fmt"
)

func main() {
  funcList := make([]func(),3)
  v := 1
  for i := 0; i < 3; i++ {
      fmt.Printf("Inserting %v \n", i)
      funcList[i] = func() {
          fmt.Println(v)   //여기가 캡쳐된 부분
      }

  }

  fmt.Printf("current funcList's v %v \n", v)

  for i:=0; i < len(funcList); i++ {
      funcList[i]()
  }


  v = 4
  fmt.Printf("current v is %v \n", v)
  for i:=0; i < len(funcList); i++ {
      funcList[i]()
  }

  v = 19999
  fmt.Printf("current v is %v \n", v)		
  for i:=0; i < len(funcList); i++ {
      funcList[i]()
  }
}

 

Comments