看来是我搜索引擎用的不够好...
正题:做 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)
}
}
这里想请教一下,是我对闭包理解错了。。。还是这里写错了
多谢!
1
frozenshadow OP ...果然是我写错了
``` f := func() func() int {} ``` 这样才应该是返回一个函数 |
2
ts25504 2016-06-19 20:22:16 +08:00 1
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) } } 楼主的意思应该是这样的吧 |
3
frozenshadow OP @ts25504 嗯,是的,这样是能调用匿名函数了。但是我搞不明白为什么输出的是内存地址。。。
|
4
penjianfeng 2016-06-19 22:17:11 +08:00 1
你的闭包返回的是一个 func() int 类型的值,而你的斐波拉那个函数的返回值是 int,你觉得是一个类型?
|
5
JamesRuan 2016-06-19 22:32:58 +08:00 1
交换两个整数不要用加加减减的方式,如果是别人教你这么做的,我都想骂他。
|
6
frozenshadow OP |
7
frozenshadow OP @JamesRuan 会有什么奇怪的 BUG 么?
|
8
frozenshadow OP @JamesRuan 哦,溢出。。。。
|
9
KiriGiri 2016-06-19 23:14:43 +08:00 1
交换直接 a, b = b, a 就行了
|
10
ts25504 2016-06-20 00:08:26 +08:00 1
@frozenshadow 返回地址应该是执行 f 返回的匿名函数 func() int 的地址
|