>  기사  >  백엔드 개발  >  고루틴 출력이 올바르지 않습니다.

고루틴 출력이 올바르지 않습니다.

WBOY
WBOY앞으로
2024-02-11 14:20:08883검색

Goroutine 的输出不正确

PHP 편집자 Zimo는 오늘 고루틴에 대한 질문을 가져왔습니다. 왜 고루틴의 출력 결과가 가끔 부정확할까요? 고루틴은 작업을 동시에 실행할 수 있는 Go 언어의 경량 스레드이지만 때로는 출력 결과가 올바르지 않을 수 있습니다. 그렇다면 이러한 상황이 발생한 이유는 무엇입니까? 함께 살펴보시죠! 이 문제를 이해함으로써 우리는 고루틴이 어떻게 작동하는지 더 잘 이해할 수 있고 실제 개발에서 유사한 문제에 직면하는 것을 피할 수 있습니다.

질문 내용

저자가 잠시 후 이상하게 동작하는 go 루틴을 사용하여 상태 애플리케이션을 작성하는 강의를 보고 있었습니다.

코드는 다음과 같습니다.

65bcd28b0b95

내가 얻는 결과는 다음과 같습니다.

65bcd28b0ba0

여기서 왜 "amazon.com"이 계속 반복되는지 이해가 안 되나요? 5개의 링크를 모두 인쇄한 후에 이런 현상이 발생하는 이유는 무엇입니까?

해결 방법

문제는 루프 변수 l 的闭包捕获。由于 goroutine 是在循环内启动的,因此循环创建的所有 goroutine 共享 l 的相同内存地址。当睡眠结束并执行 goroutine 时,由于循环迭代剩余的链接,l 的值已更改。因此,所有 goroutine 最终都会检查 links슬라이스의 마지막 링크인 "http://amazon.com"에 있습니다. 이 문제를 해결하려면 루프 변수 l를 고루틴 내부의 익명 함수에 매개변수로 전달해야 합니다. 업데이트된 코드 버전은 다음과 같습니다.

으아악

익명 함수에 l 作为参数传递给匿名函数,每个 goroutine 将拥有自己的 l를 인수로 전달하면 각 고루틴은 각 반복마다 올바른 값을 유지하면서 자체

복사본을 갖게 됩니다. 🎜

위 내용은 고루틴 출력이 올바르지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제