为了账号安全,请及时绑定邮箱和手机立即绑定

这是一个闭包的例子吗?

这是一个闭包的例子吗?

Go
元芳怎么了 2021-06-14 14:38:47
我正在阅读 Mark Summerfield 的 Go Section 5.6.3 中的 Programming 一书中的 Closure 示例。他将 Closure 定义为“一个函数,它“捕获”存在于创建它的同一作用域中的任何常量和变量,如果它引用它们的话。他说闭包的一种用途是匿名函数(或 Go 中的函数字面量)他举了这样的例子:addPng := func(name string) string { return name + ".png" }addJpg := func(name string) string { return name + ".jpg" }fmt.Println(addPng("filename"), addJpg("filename"))我知道命名的匿名函数addPng是字符串连接运算符的包装器+。如果我理解正确,他正在为匿名函数分配一个名称,然后使用该名称调用该函数。我看不出这个例子的意义。如果我定义相同的函数addPng并在内部调用它,main()我会得到相同的结果:package mainimport ("fmt")func addPng (name string) string {    return name + ".png"    }func main() {    fmt.Println(addPng("filename"))}我知道我不能在另一个函数中定义和使用一个函数。但是为什么 Summerfield 示例中的匿名函数称为“Closure”?为什么要使用包装函数?我错过了什么?
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

这是使用闭包进行状态表示的示例。


package main


import "fmt"


func NextFibonacci() func() int {

    a, b := 0, 1

    return func() (f int) {

        f, a, b = a, b, a+b

        return

    }

}


func main() {

    nf := NextFibonacci()

    f := make([]int, 7)

    for i := range f {

        f[i] = nf()

    }

    fmt.Println(len(f), f)

}

输出:


7 [0 1 1 2 3 5 8]


查看完整回答
反对 回复 2021-06-21
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

这不是我第一次看到有人提到这本特定的书,其中引用的材料要么完全错误,要么基本上完全没有抓住要点。

让我在这里停止谈论这本书,建议根本不要使用它。

有关闭包的正确定义,请参阅Wikipedia。注意形容词“词汇”。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信