Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7093503
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: 信息化

2013-08-22 14:34:40

这几天在跑GO语言的例子程序。觉得匿名函数很好玩,将例子程序中的递归函数修改为匿名的,结果程序老出问题。后来GOOGLE一下,原来GO语言不支持匿名函数的递归调用。呵呵,长了一点知识,把替代方法转一下,希望大家都了解一下,避免我的老路!!!
原文地址:http://blog.sina.com.cn/s/blog_9be3b8f10101btmi.html

[go语言]技巧:如何写一个匿名递归的函数

 (2013-01-07 10:48:21)
标签: 

golang

 

go语言

在go语言里不直接支持匿名递归函数,但是利用一些技巧也是可以实现这个特性的。
假设要利用递归来实现一个计算序列总和的匿名函数:

package main
func main() {

var sum func(int) int

sum = func(n int) int {

if n == 1 {
return 1

		

}

return n + sum(n - 1)

}

println(sum(5))

}

有人会抱怨说,如果sum变量会改了怎么办?例如以下程序会崩溃:


package main
func main() {


var sum func(int) int


sum = func(n int) int {


if n == 1 {


return 1


}


return n + sum(n - 1)


}


f, sum := sum, nil    


println(f(5))
}



解决方案是外面再包一层匿名函数:




package main
func main() {
sum := func(n int) int {    





var sum func(int) int





sum = func(n int) int {





if n == 1 {





return 1





}





return n + sum(n - 1)





}





return sum(n)





}





f, sum := sum, nil





println(f(5))





}

为什么go语言不直接支持这个特性呢?Russ Cox给出了一个解释[1]:
We've written >100k lines of Go code and it has come up maybe once. That kind of frequency doesn't suggest that a language change is warranted. 
意思就是说,在实际编码中遇到需要这种特性的几率很小很小,所以没有必要直接在语言层面去支持,如果偶然遇到就使用替代方案吧。
 
[1]
阅读(1028) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~