Does the Go programming language, as of now, optimize tail calls? If not, does it at least optimize tail-recursive calls of a function to itself?
40
votes
If I follow groups.google.com/forum/?fromgroups=#!topic/golang-nuts/…, not really
- VonC
You could test it out by writing a tail-recursive function, then writing its iterative equivalent and comparing memory usage.
- Snowball
Tail call elimination isn't really an optimisation. Since turning it off changes the run-ability of a program.
- Jessta
No they are not going to do it github.com/golang/go/issues/22624
- Bhupesh Varshney
3 Answers
17
votes
Everything you can find over the Internet, that "Go supports tailable recursions in some cases", and that was told in mailing list:
It is already there in 6g/8g for certain cases, and in gccgo somewhat more generally.
We do not currently plan to change the language to require that compilers implement tail call optimization in all cases. If you must have a tail call, you use a loop or a goto statement.
To get those cases you'd better dig into golang source, which is open.
3
votes
1
votes
Extending @Rostyslav's excellent answer. If you must have a tail call, (in this example a tail recursive call) you can do something like this.
package main
import "fmt"
func tail(i int) {
if i == 0 {
return
} else {
fmt.Println(i)
tail(i - 1) //tail recursive call
}
}
func main() {
tail(3) //3, 2, 1
}