它的编写套路通常是: 比普通的线性递归函数多一个参数,用这个参数来保存上一次调用函数得到的结果,修改上面的阶乘:它计算 6 的过程如下:不过对 factor2 和 tailFactor 进行基准测试,发现它们的性能差别好像并不大:看起来 go 的编译器并没有对尾递归进行优化,要确定的话需要把这两个函数单独写成文件,反编译出汇编代码看看他们是否有区别:忽略开头和尾部检查栈扩容的代码,两者的核心代码没有区别区别,关于 go 汇编的知识请跳到 29 节查看,如果加大参数会发现 2 个版本都会栈溢出:很多时候在函数返回之前,都需要清理释放资源,比如我们打开文件处理完之后应该关闭它。