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() 관련 문제는 작업 맵에 저장된 함수 리터럴이 루프 변수 cmd를 참조하기 때문에 발생합니다. 이 루프 변수의 인스턴스는 하나만 있으므로 맵에 저장된 모든 함수는 이를 참조합니다.
루프가 완료되면 cmd 값은 cmds 슬라이스의 마지막 요소인 "update. " 결과적으로 액션 맵의 함수가 실행되면 모두 "update"가 인쇄됩니다.
이 문제를 회피하기 위해 loop2()는 새로운 변수인 command를 사용하여 루프 변수 cmd를 캡처합니다. 이렇게 하면 각 반복마다 루프 변수의 "분리된" 복사본이 생성되며 이는 루프가 완료된 후 루프 변수의 영향을 받지 않습니다.
결과적으로 loop2()의 액션 맵에 저장된 각 함수는 루프 변수의 자체 복사본을 사용하여 각 함수가 올바른 명령을 인쇄할 수 있습니다.
슬라이스 범위를 지정할 때 다음 사항이 중요합니다. 루프 변수는 모든 반복에서 공유됩니다. 예기치 않은 동작을 방지하려면 특히 루프 후에 실행될 함수 리터럴을 사용할 때 새 변수를 사용하여 루프 변수를 캡처하거나 분리하는 것이 좋습니다.
위 내용은 Go의 'range' 루프가 다양한 루프 구조로 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!