쿼카러버의 기술 블로그
[golang] Closure(클로저)란? 본문
함수 리터럴 외부 변수를 내부 상태로 가져오는 것을 클로저라고 한다.
값 복사가 아닌 참조 형태로 가져오기 때문에, 값 변경에 주의해야 한다.
참조형태로 가져온다는 것은 외부 변수 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]()
}
}
'[Golang]' 카테고리의 다른 글
[golang] Marshal, Unmarshal 차이 (0) | 2021.08.09 |
---|---|
[golang] string pointer는 언제쓸까? (0) | 2021.08.09 |
[golang] 콘텍스트 (context)란? - 1탄 간략한 소개 (4) | 2021.08.01 |
[golang] 채널 (channel)이란? - 1탄 간단한 소개 (0) | 2021.08.01 |
[golang] 고루틴(go routine)이란? - 1탄 간단한 소개 (0) | 2021.08.01 |
Comments