Golang Go语言中初学,请教一个关于闭包的问题。

发布于 1周前 作者 htzhanglong 来自 Go语言

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

正题:做 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) } }

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

多谢!


Golang Go语言中初学,请教一个关于闭包的问题。

更多关于Golang Go语言中初学,请教一个关于闭包的问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

…果然是我写错了
<br>f := func() func() int {}<br>
这样才应该是返回一个函数

更多关于Golang Go语言中初学,请教一个关于闭包的问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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)
}
}

楼主的意思应该是这样的吧

嗯,是的,这样是能调用匿名函数了。但是我搞不明白为什么输出的是内存地址。。。

你的闭包返回的是一个 func() int 类型的值,而你的斐波拉那个函数的返回值是 int,你觉得是一个类型?

交换两个整数不要用加加减减的方式,如果是别人教你这么做的,我都想骂他。

多谢!
<br>for i := 0; i &lt; 10; i++ {<br> fmt.Printf("type:%T value:%v\n",ff(),ff())<br> }<br>

会有什么奇怪的 BUG 么?

哦,溢出。。。。

交换直接 a, b = b, a 就行了

返回地址应该是执行 f 返回的匿名函数 func() int 的地址

你好!很高兴你对Go语言感兴趣,闭包是Go语言中一个非常强大且有趣的概念。

闭包(Closure)是指一个函数以及其引用的环境变量组合而成的实体。在Go语言中,闭包通常表现为一个匿名函数(即lambda表达式),它捕获并保持了其所在作用域内的变量引用,即使这个作用域已经不存在了,这些变量依然可以被闭包访问和使用。

闭包的一个常见用途是实现回调函数和事件处理机制。通过闭包,你可以将某个函数以及它所需的上下文环境一起传递给另一个函数,并在适当的时候调用它。

下面是一个简单的Go语言闭包示例:

package main

import "fmt"

func main() {
    counter := 0
    increment := func() int {
        counter++
        return counter
    }
    fmt.Println(increment()) // 输出: 1
    fmt.Println(increment()) // 输出: 2
}

在这个例子中,increment是一个闭包,它捕获并保持了counter变量的引用。每次调用increment时,它都会访问并更新counter的值。

需要注意的是,闭包中的变量是引用传递的,这意味着如果你在闭包外部修改了这些变量的值,闭包内部也会感知到这些变化。

希望这个解释能帮助你更好地理解Go语言中的闭包。如果你还有其他问题或需要进一步的帮助,请随时提问!

回到顶部