2 回答
TA贡献1811条经验 获得超6个赞
在定义一个使用外部作用域变量的内部函数时,我应该将变量作为参数传递给内部函数吗?
这取决于你想要达到的目标。
你所说的“函数内的函数”实际上被称为“闭包”(有些人称之为“lambda”)。
闭包从外部词法范围捕获变量,在其主体中引用。在 Go 中,这种捕获是“通过引用”或“通过名称”完成的,这基本上意味着每次调用闭包时,它都会“看到”它关闭的变量的当前值,而不是这些变量在关闭时的值被创建——观察程序:
package main
import (
"fmt"
)
func main() {
i := 42
fn := func() {
fmt.Println(i)
}
fn()
i = 12
fn()
}
会输出
42
12
相反,当您将值作为参数传递给闭包调用时,每次调用都会准确地看到传递给它的值。
我希望你现在明白选择什么策略在很大程度上取决于你想要什么。
从概念上讲,您可能将闭包视为临时匿名struct数据类型的实例,其字段是指向闭包关闭的变量的指针,并且每次对该闭包的调用都类似于调用一些(匿名的,唯一的) ) 该类型提供的方法(实际上,这就是编译器通常在你背后做的来实现闭包)。这样的“方法”可能有参数,它是否应该有参数,什么应该进入类型的字段以及该方法的参数应该是什么,可以使用您对常规类型采用的常用方法来判断。
TA贡献1840条经验 获得超5个赞
在这种情况下,这两个功能之间没有功能差异。正如您所注意到的,局部函数可以访问局部变量而无需显式传递它们。在您的示例中,您可能更喜欢使用 generate1 以便于阅读。
- 2 回答
- 0 关注
- 126 浏览
添加回答
举报