>백엔드 개발 >Golang >고루틴 내에서 호출된 함수의 반환 값은 어떻게 되나요?

고루틴 내에서 호출된 함수의 반환 값은 어떻게 되나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-06 07:49:14823검색

What Happens to the Return Values of Functions Called within Goroutines?

고루틴에서 반환 값은 어떻게 되나요?

고루틴에서 함수를 호출할 때 일반적으로 반환된 값은 손실됩니다. 자체 격리된 실행 환경 함수는 반환된 값을 스택에 저장할 수 있지만 이 스택은 기본 프로그램의 스택과 별개이며 고루틴이 종료될 때 제거됩니다.

함수 반환 값 분석

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.