go - 这是一个闭包示例吗?

标签 go closures wrapper

我正在阅读 Mark Summerfield 的书 Programming in Go Section 5.6.3 中的闭包示例。他将 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 main

import ("fmt")

func addPng (name string) string {
    return name + ".png"
    }

func main() {
    fmt.Println(addPng("filename"))
}

我明白我不能在另一个函数中定义和使用一个函数。但是为什么 Summerfield 例子中的匿名函数叫做“Closure”呢?为什么要使用包装函数?我错过了什么?

最佳答案

这是一个为 state representation 使用闭包的例子.

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]

关于go - 这是一个闭包示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512876/

相关文章:

swift - 从闭包返回一个 bool 值

powershell - 如何为使用动态参数的高级函数 cmdlet 创建包装器

swift - 解释 Swift Closure 语法

java - HikariCP 包装器(线程安全)

php - "Inactive Wrapper"创建大量空白

go - slice of slice 中的接口(interface)转换

go - 第一个完成时如何安全地绕过其他 goroutine 的结果

go - Go构造函数中的返回值与指针

floating-point - 在 Go 中获取机器 epsilon 的最简单方法

循环内的 JavaScript 闭包——简单实用的例子