将参数传递给函数闭包
Go 中的函数闭包允许内部函数访问封闭函数的变量。这就提出了一个问题:什么时候最好将参数传递给内部函数而不是使用闭包?
在第一个示例中,使用参数(即通道)创建了一个匿名函数。在向通道发送值之前,此函数会休眠一小段时间。在第二个示例中,内部函数被创建为闭包,从外部函数访问通道变量。
这两种方法之间的选择取决于预期的用例。当每个函数调用应该接收不同的值时,首选参数。当函数作为较大函数的一部分返回时,这非常有用,因为可以在创建闭包之前自定义参数。
相反,当所有函数调用应共享同一变量时,闭包更适合。在提供的示例中,两种方法最终都实现了在延迟后将值发送到通道的相同结果。然而,闭包确保每个 goroutine 访问相同的共享通道对象。
考虑以下示例来说明差异:
for i := 0; i < 3; i++ { // Closure example: all calls share the same 'i' go func() { fmt.Println(i) }() // Parameter example: each call receives a copy of 'i' go func(v int) { fmt.Println(v) }(i) }
在闭包示例中,所有函数调用 print '3 ' 因为在 goroutine 执行时,'i' 的值可能已经改变。在参数示例中,每次调用都会从创建函数时接收“i”的副本,从而产生值“0”、“1”和“2”。
最终,使用闭包或参数取决于特定的用例以及封闭函数和内部函数之间所需的变量共享。
以上是Go 函数中何时传递参数与使用闭包?的详细内容。更多信息请关注PHP中文网其他相关文章!