首頁 > 後端開發 > Golang > 主體

為什麼我無法在 Go 中定義巢狀函數,但可以定義巢狀結構?

Barbara Streisand
發布: 2024-11-03 23:44:30
原創
921 人瀏覽過

Why Can't I Define Nested Functions in Go, but I Can Define Nested Structures?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!