>백엔드 개발 >Golang >Go 익명 함수에서 매개변수와 클로저를 언제 사용해야 합니까?

Go 익명 함수에서 매개변수와 클로저를 언제 사용해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-19 05:00:02969검색

When to Use Parameters vs. Closures in Go Anonymous Functions?

함수 클로저에 매개변수 전달

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.