40
votes

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?

3
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

It does not. Nor is there any plan to according to the core development team on the mailing list.

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
}