>백엔드 개발 >Golang >Go의 'range' 루프가 다양한 루프 구조로 다른 결과를 생성하는 이유는 무엇입니까?

Go의 'range' 루프가 다양한 루프 구조로 다른 결과를 생성하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-19 18:20:10988검색

Why Does Go's `range` Loop Produce Different Results with Varying Loop Structures?

Go의 다양한 루프 변형 이해

Go에서 슬라이스를 반복할 때 범위 방법을 사용할 때 예기치 않은 동작이 발생할 수 있습니다. 다양한 루프 변형이 왜 다른 결과를 생성할 수 있는지 살펴보겠습니다.

문제

다음 두 for 루프 변형을 고려하세요.

loop1() {
    for _, cmd := range cmds {
        // Store a function literal that references the loop variable cmd
        actions[cmd] = func() {
            fmt.Println(cmd)
        }
    }
}
loop2() {
    for i, cmd := range cmds {
        // Capture the loop variable cmd using a new variable
        command := cmds[i]
        actions[cmd] = func() {
            fmt.Println(command)
        }
    }
}

이러한 루프 결과 실행 무관심한 출력:

  • loop1(): "update"를 세 번 인쇄합니다.
  • loop2(): "delete", "update를 인쇄합니다. ", 그리고 "만들기"

설명

loop1() 관련 문제는 작업 맵에 저장된 함수 리터럴이 루프 변수 cmd를 참조하기 때문에 발생합니다. 이 루프 변수의 인스턴스는 하나만 있으므로 맵에 저장된 모든 함수는 이를 참조합니다.

루프가 완료되면 cmd 값은 cmds 슬라이스의 마지막 요소인 "update. " 결과적으로 액션 맵의 함수가 실행되면 모두 "update"가 인쇄됩니다.

이 문제를 회피하기 위해 loop2()는 새로운 변수인 command를 사용하여 루프 변수 cmd를 캡처합니다. 이렇게 하면 각 반복마다 루프 변수의 "분리된" 복사본이 생성되며 이는 루프가 완료된 후 루프 변수의 영향을 받지 않습니다.

결과적으로 loop2()의 액션 맵에 저장된 각 함수는 루프 변수의 자체 복사본을 사용하여 각 함수가 올바른 명령을 인쇄할 수 있습니다.

결론

슬라이스 범위를 지정할 때 다음 사항이 중요합니다. 루프 변수는 모든 반복에서 공유됩니다. 예기치 않은 동작을 방지하려면 특히 루프 후에 실행될 함수 리터럴을 사용할 때 새 변수를 사용하여 루프 변수를 캡처하거나 분리하는 것이 좋습니다.

위 내용은 Go의 'range' 루프가 다양한 루프 구조로 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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