I started to learn go language days ago. When I tried to start writing some fun codes, I am stuck by a strange behavior.
package main
import "fmt"
func recv(value int) {
if value < 0 {
return
}
fmt.Println(value)
go recv(value-1)
}
func main() {
recv(10)
}
when I run the above code, only 10 is printed. When I remove the go before the call to recv, 10 to 0 are printed out. I believe I am misusing go routine here, but I can not understand why it failed start a go routine this way.
When the main function returns, Go will not wait for any still existing goroutines to finish but instead just exit.
recvwill return to main after the first “iteration” and because main has nothing more to do, the program will terminate.One solution to this problem is to have a channel that signals that all work is done, like the following:
Here,
recvwill send a single boolean before returning, andmainwill wait for that message on the channel.For the logic of the program, it does not matter what type or specific value you use.
boolandtrueare just a straightforward example. If you want to be more efficient, using achan struct{}instead of achan boolwill save you an additional byte, since empty structs do not use any memory.