>백엔드 개발 >Golang >Go는 For-Loop 변수를 값이나 변수로 캡처합니까?

Go는 For-Loop 변수를 값이나 변수로 캡처합니까?

DDD
DDD원래의
2024-12-24 01:09:17142검색

Does Go Capture For-Loop Variables as Values or Variables?

Go에서 캡처된 클로저(for-loop 변수)

Go의 for-loop 변수가 로컬로 할당된 클로저 변수로 캡처되지 않습니까?

아니요. Go에서 캡처된 for-loop 변수는 기본적으로 변수가 아닌 값으로 캡처됩니다. 이 동작은 값 대신 변수를 캡처하기 위해 추가 구문이 필요한 C#과 같은 언어와 다릅니다.

예: 루프 변수를 값으로 캡처

package main

import "fmt"

func main() {
    a := 1
    b := func() { fmt.Println(a) } // b captures the value of a, not the variable itself
    a++
    b() // prints 1, not 2
}

이 예에서는 , 함수 b는 변수 자체에 대한 참조를 유지하는 대신 a가 정의된 시점의 값을 캡처합니다. 결과적으로 b를 정의한 후 a에 대한 모든 변경 사항은 b가 인쇄한 값에 반영되지 않습니다.

예: 루프 변수를 변수로 캡처

그러나 이는 각 반복에 대해 새 범위를 생성하는 클로저 구문을 사용하여 루프 변수를 변수로 캡처할 수 있습니다.

package main

import "fmt"

func main() {
    a := 1
    for a < 10 {
        b := func() { fmt.Println(a) } // b captures the variable a in a new scope
        a++
        b() // prints 2, 3, 4, ..., 10
    }
}

In 이 예에서 func 키워드는 루프의 각 반복에 대한 클로저를 생성하는 데 사용됩니다. 이 기술을 사용하면 각 클로저가 루프 변수에 대한 고유한 참조를 캡처하여 루프 내에서 값이 변경될 때 a 값을 관찰할 수 있습니다.

결론

이동 기본적으로 for-loop 변수를 값으로 캡처하지만 for-loop 변수를 변수로 캡처할 수 있는 클로저 구문도 제공합니다. 혼란을 피하고 정확하고 효율적인 Go 코드를 작성하려면 이러한 차이점을 이해하는 것이 중요합니다.

위 내용은 Go는 For-Loop 변수를 값이나 변수로 캡처합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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