>  기사  >  백엔드 개발  >  동일한 구조에 대해 Golang은 for 루프에서 연기 시 다르게 동작합니다.

동일한 구조에 대해 Golang은 for 루프에서 연기 시 다르게 동작합니다.

WBOY
WBOY앞으로
2024-02-06 09:30:11938검색

对于同一结构体,Golang 在 for 循环中 defer 的行为有所不同

질문 내용

다음과 같은 golang코드를 작성하고 실행해봤습니다.

으아아아

출력:

으아아아

제가 이해한 바는 포인터 t 在 3 个循环后将指向“c”,因此三个 3“c”用于“hello2”输出。然而,延迟“hello”函数调用的行为非常奇怪。看起来它正在保留它所指向的位置。 (t test)가 이것에 어떤 영향을 미치나요?

이것을 golang에서 무엇으로 컴파일하는지 궁금합니다. 매우 감사합니다!


정답


은 for 루프 defer 语句的参数是一个闭包。闭包捕获循环变量 t 안에 있습니다.

값 수신자를 사용하는 호출의 경우 클로저에는 t 的副本。对于使用指针接收器的调用,闭包包含一个指向 t 포인터가 포함됩니다.

루프 변수는 반복할 때마다 다시 작성됩니다(이 동작은 언어의 이후 버전에서 변경됩니다). 따라서 값 수신기 클로저는 모든 값을 캡처하는 반면 포인터 수신기 클로저는 포인터만 캡처하므로 런타임에는 해당 포인터의 최신 값을 사용합니다.

위 내용은 동일한 구조에 대해 Golang은 for 루프에서 연기 시 다르게 동작합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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