0
爲什麼下面的代碼中的test()函數是這樣組織的,而不是將test()中的所有內容都放進去並放到foo()中?謝謝!爲什麼我們在Go中有一個獨立的測試()在foo()中?
func foo() error{
...
err = test() error {
...
...
}
...
}
爲什麼下面的代碼中的test()函數是這樣組織的,而不是將test()中的所有內容都放進去並放到foo()中?謝謝!爲什麼我們在Go中有一個獨立的測試()在foo()中?
func foo() error{
...
err = test() error {
...
...
}
...
}
有幾個原因,您可能希望這樣的內部函數,但到目前爲止最常見的用途是當你需要在內部函數中使用本地變量從包含的功能。爲什麼內在的功能呢?有時您需要將它傳遞到庫中,或者您需要它來獲取go
或defer
語句。
內部函數「關閉」它使用的來自外部函數的任何變量,並且這些變量即使在外部函數返回後仍保持有效。由於這個原因,這樣定義的函數被稱爲「閉包」。
一個常見的用途是回調等與某些庫一起使用。有時候它更容易實現你需要的功能。
另一個常見用途是如果你想使用defer
代碼塊。 defer
只適用於函數,並且通常需要來自外部函數的變量。通常你會看到這種情況與recover
一起使用並命名爲返回值。顯然這與原因#1重疊。
最後有時你想要並行運行一個函數的一部分,所以你創建了一個閉包,並把它作爲一個go
作爲goroutine調用它。
封閉當然還有其他用途...
沒有上下文是絕對沒有辦法回答的。代碼組織不是普遍的,而是情境性的。 – Adrian