將參數傳遞給函數閉包
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中文網其他相關文章!