What Happens to Return Values from Goroutines?
When invoking a function from a goroutine, the returned value is typically lost since goroutines have their own isolated execution environment. While the function may store its returned value on the stack, this stack is separate from the main program's stack and is destroyed when the goroutine exits.
Analysis of Function Return Values
Examining the assembly output for the getNumber function using the -gcflags -S flag reveals that it does store its returned value on the 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) }
However, this value is stored on a new stack within the goroutine, which is subsequently destroyed when the goroutine terminates, making the return value inaccessible from the main program.
Example
Consider the following 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) }
In this example, the getNumber function is invoked as a goroutine, and its return value is not immediately usable because it's stored on a separate stack.
Should We Avoid Return Values in Goroutines?
To avoid losing return values, it's generally recommended to use communication mechanisms such as channels to share data between the goroutine and the main program:
The above is the detailed content of What Happens to the Return Values of Functions Called within Goroutines?. For more information, please follow other related articles on the PHP Chinese website!