Go에서 클로저와 함수 매개변수는 익명 함수 내의 변수를 처리하기 위한 고유한 메커니즘을 제공합니다. 미묘한 차이를 살펴보고 한 접근 방식이 다른 접근 방식보다 우수한지 살펴보겠습니다.
익명 함수가 클로저 역할을 할 때, 다음에 정의된 변수에 대한 액세스를 유지합니다. 주변 범위. 이 변수는 클로저의 모든 인스턴스에서 공유됩니다. 즉, 동일한 메모리 주소를 참조합니다. 이는 누계를 유지하거나 카운터를 증가시키는 등 동일한 데이터에 대해 여러 함수 호출을 수행하려는 경우에 유용할 수 있습니다.
반대로, 익명 함수에 매개변수를 전달하면 함수는 값의 복사본을 받습니다. 이는 함수의 각 인스턴스가 호출 범위에서 격리된 고유한 변수 복사본을 가짐을 의미합니다. 이는 원래 값에 영향을 주지 않고 각 함수 호출이 독립적으로 작동하기를 원할 때 유용합니다.
클로저 사용과 함수 매개변수 사용 중 선택은 의도한 동작에 따라 다릅니다. . 동일한 변수와 해당 수정 사항을 공유하기 위해 모든 함수 호출이 필요한 경우 클로저가 더 적합합니다. 반면, 각 함수 호출이 자체 변수 복사본에서 작동해야 하는 경우 매개변수를 사용해야 합니다.
이 차이점을 설명하려면 다음을 고려하세요. 예:
클로저:
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() }
매개변수:
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) }
클로저 예에서 모든 함수 호출은 고루틴이 실행될 때 최종 값이 3인 동일한 공유 변수 i에 액세스합니다. 이로 인해 출력 3이 세 번 인쇄됩니다.
그러나 함수 매개 변수 예에서 각 함수 호출은 호출 시 변수 i의 복사본을 받습니다. 따라서 각 고루틴은 인수로 전달된 순간의 i 값을 인쇄하므로 출력은 0, 1, 2입니다.
위 내용은 Go의 클로저와 매개변수: 언제 익명 함수에 어느 것을 사용해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!