Go:函數內的巢狀類別
在Go 中,可以在函數內定義巢狀結構,如程式碼區塊所示:
<code class="go">func f() { // Nested struct Cls inside f type Cls struct { ... } }</code>
但是,除了lambda 函數之外,無法在函數內宣告巢狀函數。考慮到對嵌套結構的支持,這可能看起來很不尋常。
替代方案和解決方法
雖然不可能以傳統意義上定義嵌套函數,但還有其他替代方法實現類似的功能:
1.函數文字:
函數文字可讓您定義匿名函數並將其儲存在變數中。然後,該函數可以用作另一個函數的參數,或在定義它的函數內使用。例如:
<code class="go">func f() { foo := func(s string) { fmt.Println(s) } foo("Hello World!") }</code>
在此範例中,函數文字被指派給 f 中的變數 foo功能。當使用字串參數呼叫 foo 時,它會列印“Hello World!”到控制台。
2.閉包:
閉包可讓您建立可以存取在其建立範圍內定義的變數的函數。這使您可以透過在閉包中定義函數來有效地「巢狀」函數。例如:
<code class="go">func f() func(s string) { return func(s string) { fmt.Println(s) } } foo := f() foo("Hello World!")</code>
在此範例中,f 函數傳回一個可以存取函數作用域中的變數的函數文字。這允許您呼叫傳回的函數並向其傳遞參數,即使它是在 f.
中定義的。值得注意的是,雖然這些替代方案提供了一定的靈活性,但它們與傳統的巢狀函數不同。
以上是為什麼我無法在 Go 中定義巢狀函數,但可以定義巢狀結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!