初学 golang,请教一个关于闭包的问题。

2016-06-19 19:57:48 +08:00
 frozenshadow

看来是我搜索引擎用的不够好...

正题:做 Go 的入门指导的时候,有一个需要用闭包解决的斐波那契数

用 tour 中给的结构,很容易搞定了。。

package main

import "fmt"

func main() {
	f :=  fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}

func fibonacci() func() int {
	a,b := 0,0
	return func () int{
		if b<2{
			a=b
			b++
			return b
		}else{
			//给 a 赋值
			a=a+b
			//交换 a b 值
			a=a+b
			b=a-b
			a=a-b
			return b
		}
	}
}

然后我想试试把函数体直接放在 main()中试试

package main

import "fmt"

func main() {
	f :=  func() int {
		a,b := 0,0
		return func () int{ //这里报错 cannot use func literal (type func() int) as type int in return argument
			if b<2{
				a=b
				b++
				return b
			}else{
				//给 a 赋值
				a=a+b
				//交换 a b 值
				a=a+b
				b=a-b
				a=a-b
				return b
			}
		}
	}
	for i := 0; i < 10; i++ {
		fmt.Println(f)
	}
}

这里想请教一下,是我对闭包理解错了。。。还是这里写错了

多谢!

1384 次点击
所在节点    Go 编程语言
10 条回复
frozenshadow
2016-06-19 20:12:49 +08:00
...果然是我写错了
```
f := func() func() int {}
```
这样才应该是返回一个函数
ts25504
2016-06-19 20:22:16 +08:00
package main

import "fmt"

func main() {
f := func() func() int {
a,b := 0,0
return func () int{
if b<2{
a=b
b++
return b
}else{
//给 a 赋值
a=a+b
//交换 a b 值
a=a+b
b=a-b
a=a-b
return b
}
}
}
ff := f()
for i := 0; i < 10; i++ {
fmt.Println(ff)
}
}

楼主的意思应该是这样的吧
frozenshadow
2016-06-19 21:59:20 +08:00
@ts25504 嗯,是的,这样是能调用匿名函数了。但是我搞不明白为什么输出的是内存地址。。。
penjianfeng
2016-06-19 22:17:11 +08:00
你的闭包返回的是一个 func() int 类型的值,而你的斐波拉那个函数的返回值是 int,你觉得是一个类型?
JamesRuan
2016-06-19 22:32:58 +08:00
交换两个整数不要用加加减减的方式,如果是别人教你这么做的,我都想骂他。
frozenshadow
2016-06-19 22:37:37 +08:00
@penjianfeng 多谢!
```
for i := 0; i < 10; i++ {
fmt.Printf("type:%T value:%v\n",ff(),ff())
}
```
frozenshadow
2016-06-19 22:39:06 +08:00
@JamesRuan 会有什么奇怪的 BUG 么?
frozenshadow
2016-06-19 22:42:47 +08:00
@JamesRuan 哦,溢出。。。。
KiriGiri
2016-06-19 23:14:43 +08:00
交换直接 a, b = b, a 就行了
ts25504
2016-06-20 00:08:26 +08:00
@frozenshadow 返回地址应该是执行 f 返回的匿名函数 func() int 的地址

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286874

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX