Go에서 전달된 매개변수가 있는 익명 함수는 클로저와 다르게 동작할 수 있습니다. 이 글에서는 차이점과 그 의미에 대해 자세히 설명합니다.
클로저 예:
func main() { done := make(chan bool, 1) go func() { time.Sleep(50 * time.Millisecond) done <- true }() <-done }
이 클로저에서 익명 함수는 매개변수가 없으며 대신 주변 범위에 있는 done 채널에 액세스합니다.
매개변수 예:
func main() { done := make(chan bool, 1) go func(c chan bool) { time.Sleep(50 * time.Millisecond) c <- true }(done) <-done }
이 경우 익명 함수는 채널인 매개변수 c를 가져와 직접 상호작용합니다.
매개변수를 사용해야 하는 경우
익명 함수에 매개변수를 전달하는 것은 변수 공유가 예상치 못한 동작으로 이어질 수 있는 시나리오에서 주로 유용합니다. 다음 예를 살펴보세요.
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() // Closure }
여기서 익명 함수는 클로저입니다. 즉, for 루프에 정의된 i 변수를 참조합니다. 모든 고루틴은 동일한 i 변수를 공유하므로 "0", "1" 및 "2"를 인쇄할 것으로 예상하더라도 "3"(루프가 완료된 후 i의 최종 값)을 인쇄합니다.
이 문제를 해결하려면 i를 매개변수로 전달할 수 있습니다.
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) // Parameter }
이제 각 고루틴은 함수가 호출될 때 i 변수의 복사본을 수신하여 올바른 출력을 얻습니다. " 0", "1" 및 "2".
결론
클로저를 사용하면 주변 범위 내의 변수에 편리하게 액세스할 수 있지만 매개변수를 전달하면 더 많은 제어와 특히 동시 시나리오에서 공유 변수를 처리할 때 예측 가능한 동작을 보장합니다.
위 내용은 Go 익명 함수에서 매개변수와 클로저를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!