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 중국어 웹사이트의 기타 관련 기사를 참조하세요!