제공된 코드에서 두 개의 루프 변형이 서로 다른 동작을 나타냅니다. 슬라이스에서 요소에 액세스할 때. Loop1은 "update"를 반복적으로 반환하고 Loop2는 예상되는 "delete", "update" 및 "create" 순서를 인쇄합니다.
이 차이점을 이해하는 열쇠는 다음에 있습니다. 루프 변수(cmd)가 클로저(func())에서 사용되는 방식입니다. Loop1에서는 루프 변수에 대한 참조가 클로저에 저장됩니다. 이는 cmd에 대한 후속 변경 사항이 맵의 모든 클로저에 영향을 미친다는 것을 의미합니다.
두 번째 루프가 실행될 때 cmd 값은 cmds 슬라이스의 마지막 요소인 "update"로 이미 업데이트되었습니다. 따라서 맵의 모든 클로저가 이 마지막 값을 참조하여 "업데이트"가 반복적으로 출력됩니다.
그러나 Loop2에서는 루프 변수의 복사본이 클로저에 저장됩니다. 이렇게 하면 원래 cmd에 대한 후속 변경 사항에 영향을 받지 않는 분리된 변수가 생성됩니다. 루프를 반복할 때마다 cmd2에 다른 값이 할당되고 클로저는 이를 참조합니다.
결과적으로 두 번째 루프는 cmds 슬라이스의 각 요소를 올바르게 인쇄합니다.
이러한 참조 문제를 방지하려면 일반적으로 클로저 내의 요소에 액세스할 때 루프 변수 대신 슬라이스의 인덱스를 사용하는 것이 좋습니다. 이런 방식으로 각 클로저는 루프 변수의 변경에 관계없이 올바른 요소에 액세스할 수 있습니다.
범위 루프에서 반환된 두 번째 값(요소의 복사본) 원래 변수에 대한 동시 액세스에 대해 걱정하지 않고 별도의 고루틴이나 스레드에 값을 전달하려는 경우 유용할 수 있습니다. 이는 소스 손상에 대한 두려움 없이 데이터를 공유해야 하는 작업에 편리합니다.
위 내용은 참조와 루프 변수의 복사본을 사용할 때 Golang의 루프 동작이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!