고루틴에서 반환 값은 어떻게 되나요?
고루틴에서 함수를 호출할 때 일반적으로 반환된 값은 손실됩니다. 자체 격리된 실행 환경 함수는 반환된 값을 스택에 저장할 수 있지만 이 스택은 기본 프로그램의 스택과 별개이며 고루틴이 종료될 때 제거됩니다.
함수 반환 값 분석
-gcflags -S 플래그를 사용하여 getNumber 함수에 대한 어셈블리 출력을 검사하면 반환된 값이 stack:
"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0 0x0000 00000 (z.go:5) TEXT "".getNumber+0(SB),4,<pre class="brush:php;toolbar:false">func getNumber(i int) int { return i } func main() { for i := 0; i < 10; i++ { go printNumber(i) } time.Sleep(5) }-16 0x0000 00000 (z.go:6) MOVQ "".i+8(FP),BX 0x0005 00005 (z.go:6) MOVQ BX,"".~r1+16(FP) 0x000a 00010 (z.go:6) RET
그러나 이 값은 고루틴 내의 새 스택에 저장되며, 고루틴이 종료되면 이후에 폐기되므로 기본 프로그램에서 반환 값에 액세스할 수 없습니다.
예
다음을 고려하세요 code:
func getNumber(i int) chan int { ch := make(chan int) go func() { ch <- i }() return ch } func main() { for i := 0; i < 10; i++ { ch := getNumber(i) num := <-ch fmt.Println(num) } time.Sleep(5) }
이 예에서 getNumber 함수는 고루틴으로 호출되며 해당 반환 값은 별도의 스택에 저장되기 때문에 즉시 사용할 수 없습니다.
고루틴에서는 반환 값을 피합니까?
반환 값 손실을 방지하려면 일반적으로 다음을 수행하는 것이 좋습니다. 채널과 같은 통신 메커니즘을 사용하여 고루틴과 메인 프로그램 간에 데이터를 공유합니다.
위 내용은 고루틴 내에서 호출된 함수의 반환 값은 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!