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

WBOY
풀어 주다: 2024-02-06 09:30:11
앞으로
932명이 탐색했습니다.

对于同一结构体,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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!