在 Go 中,闭包和函数参数为处理匿名函数中的变量提供了不同的机制。让我们深入研究细微差别,并探讨一种方法何时优于另一种方法。
当匿名函数充当闭包时,它保留对周围的范围。这些变量在闭包的所有实例之间共享,这意味着它们引用相同的内存地址。当您希望多个函数调用对同一数据进行操作(例如维护运行总计或递增计数器)时,这可能很有用。
相反,当您将参数传递给匿名函数,该函数接收该值的副本。这意味着函数的每个实例都有自己独特的变量副本,与调用范围隔离。当您希望每个函数调用独立操作而不影响原始值时,这很有用。
使用闭包或函数参数之间的选择取决于预期的行为。如果您需要所有函数调用共享相同的变量及其修改,则闭包更合适。另一方面,如果每个函数调用都应在其自己的变量副本上进行操作,则应使用参数。
为了说明这种差异,请考虑以下内容示例:
闭包:
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() }
参数:
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) }
在闭包示例中,所有函数调用将访问相同的共享变量 i,当 goroutine 执行时,它的最终值为 3。这会导致输出 3 被打印三次。
然而,在函数参数示例中,每个函数调用都会在调用时接收变量 i 的副本。因此,输出为 0、1 和 2,因为每个 goroutine 都会打印 i 作为参数传递时的值。
以上是Go 中的闭包与参数:何时对匿名函数使用闭包?的详细内容。更多信息请关注PHP中文网其他相关文章!