recursive function in go language
go
Solution
When the main function returns, Go will not wait for any still existing goroutines to finish but instead just exit.
`recv` will 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:
package main
import "fmt"
func recv(value int, ch chan bool) {
if value < 0 {
ch <- true
return
}
fmt.Println(value)
go recv(value - 1, ch)
}
func main() {
ch := make(chan bool)
recv(10, ch)
<-ch
}
Here, `recv` will send a single boolean before returning, and `main` will wait for that message on the channel.
For the logic of the program, it does not matter what type or specific value you use. `bool` and `true` are just a straightforward example. If you want to be more efficient, using a `chan struct{}` instead of a `chan bool` will save you an additional byte, since empty structs do not use any memory.
Problem
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.