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

Go 可以直接將函數呼叫表示為用作參數的類型嗎?

Mary-Kate Olsen
發布: 2024-10-29 03:29:02
原創
800 人瀏覽過

Can Go directly represent function calls as a type for use as parameters?

函數呼叫的 Go 類型

使用 go 和 defer 等關鍵字時,需要函數呼叫作為參數。但是,是否存在可以以類似方式使用的特定類型,特別是用於創建需要函數呼叫(而不僅僅是函數本身)作為參數的函數?

限制和解決方法

Go 沒有提供直接允許此功能的類型。相反,我們可以使用函數類型的變數或值,然後像函數一樣呼叫它們。例如:

<code class="go">func myFunc() {
    fmt.Println("hi")
}

func main() {
    var f func()
    f = myFunc
    f() // This calls the function value stored in f: myFunc in this example
}</code>
登入後複製

要實現評論中提到的所需功能,請將函數呼叫和參數包裝在 func() 中並利用它。例如:

<code class="go">func launch(f func()) {
    fmt.Println("Before launch")
    go func() {
        defer fmt.Println("After completion")
        f()
    }()
}</code>
登入後複製

用法:

<code class="go">func main() {
    launch(func() {
        fmt.Println("Hello, playground")
    })

    time.Sleep(time.Second)
}</code>
登入後複製

輸出:

Before launch
Hello, playground
After completion
登入後複製

此方法不涉及直接解。如果參數發生變化,請在呼叫 launch() 之前建立一個副本,並在函數文字(閉包)中使用該副本。

模仿自動參數保存

對於特定函數類型,建立一個具有相同簽名的輔助函數,傳回一個不含參數的函數。傳回的函數充當閉包,使用參數呼叫原始函數。呼叫輔助函數可以有效地保存參數,模仿defer 的行為:

<code class="go">func wrapPrintln(s string) func() {
    return func() {
        fmt.Println(s)
    }
}</code>
登入後複製

用法:

<code class="go">launch(wrapPrintln(s))</code>
登入後複製

使用反射

使用反射
<code class="go">func launch(f interface{}, params ...interface{}) {
    fmt.Println("Before launch")
    go func() {
        defer fmt.Println("After completion")
        pv := make([]reflect.Value, len(params))
        for i, v := range params {
            pv[i] = reflect.ValueOf(v)
        }
        reflect.ValueOf(f).Call(pv)
    }()
}</code>
登入後複製

<code class="go">func main() {
    i, s := 1, "Hello, playground"

    launch(fmt.Printf, "%d %q\n", i, s)
    i, s = 2, "changed"

    time.Sleep(time.Second)
}</code>
登入後複製
使用反射

Before launch
1 "Hello, playground"
After completion
登入後複製

使用反射

使用反射可以反射消除手動複製的需要,但這種方法涉及將函數作為參數傳遞而不是呼叫它們。由於反射開銷,速度也較慢。

範例用法:輸出:異常:方法值異常:方法值

以上是Go 可以直接將函數呼叫表示為用作參數的類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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