> 백엔드 개발 > Golang > 이 Go 코드 예제에서 Loop1이 세 번 '업데이트'를 인쇄하는 반면 Loop2는 다른 값을 인쇄하는 이유는 무엇입니까?

이 Go 코드 예제에서 Loop1이 세 번 '업데이트'를 인쇄하는 반면 Loop2는 다른 값을 인쇄하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-11 03:53:14
원래의
457명이 탐색했습니다.

Why Does Loop1 Print

Go의 For 루프 동작 이해

프로그래밍에서 특정 구성은 예상치 못한 동작으로 이어질 수 있습니다. for 루프의 두 가지 변형을 고려해 보세요.

var cmds = []string{"create", "delete", "update"}

func loop1() {
    actions := make(map[string]func())

    for _, cmd := range cmds {
        actions[cmd] = func() {
            fmt.Println(cmd)
        }
    }
    for _, action := range actions {
        action()
    }
}

func loop2() {
    actions := make(map[string]func())

    for i, cmd := range cmds {
        command := cmds[i]
        actions[cmd] = func() {
            fmt.Println(command)
        }
    }
    for _, action := range actions {
        action()
    }
}
로그인 후 복사

Loop1은 "update"를 세 번 인쇄하고 loop2는 "delete", "update" 및 "create"를 인쇄합니다. 이 동작을 이해하기 위해 세부 사항을 살펴보겠습니다.

루프 변수 참조

loop1에서는 루프 변수 cmd를 선언하고 이를 사용하여 cmds 슬라이스를 반복합니다. . 그러나 중첩 루프 내에서 변수 cmd는 여전히 외부 루프의 루프 변수를 참조합니다.

클로저에서 값 공유

맵에서 함수 리터럴을 생성할 때 작업을 수행하면 루프 변수 cmd가 클로저에 의해 캡처됩니다. 이는 각 함수가 복사본이 아닌 동일한 루프 변수 인스턴스에 대한 참조를 상속한다는 것을 의미합니다.

마지막 값 종속성

중첩 루프가 완료될 때까지 루프 변수 cmd가 슬라이스의 마지막 요소("업데이트")로 진행되었습니다. 이는 이제 모든 클로저가 마지막 요소를 참조한다는 의미입니다.

결과:

중첩 루프 내에서 인쇄할 때 모든 클로저는 "update"를 인쇄합니다. 동일한 마지막 요소 Slice.

수정:

이 문제를 해결하려면 cmd2 := cmd를 사용하여 loop1에서 루프 변수의 복사본을 생성하고 함수 리터럴에서 해당 복사본을 사용합니다. . 이렇게 하면 각 클로저가 생성 시 cmd 값에 대한 고유한 참조를 갖게 됩니다.

이 설명은 클로저 내 루프 변수 참조의 미묘한 차이를 강조하고 클로저가 Go에서 변수를 캡처하는 방법을 주의 깊게 이해하는 것이 중요함을 보여줍니다. .

위 내용은 이 Go 코드 예제에서 Loop1이 세 번 '업데이트'를 인쇄하는 반면 Loop2는 다른 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿