首頁 >後端開發 >Golang >考慮到類型相容性限制,如何在 Go 中將任意函數作為參數傳遞?

考慮到類型相容性限制,如何在 Go 中將任意函數作為參數傳遞?

Linda Hamilton
Linda Hamilton原創
2025-01-03 09:16:39448瀏覽

How Can I Pass an Arbitrary Function as a Parameter in Go, Considering Type Compatibility Limitations?

在 Go 中將任意函數作為參數傳遞

在 Go 中將函數作為參數傳遞允許動態建立和執行程式碼。但是,可以傳遞的函數類型是有限制的。

考慮以下場景:我們想要建立一個裝飾器函數,它可以包裝任何接受一個參數並傳回單一值的函數。為了處理接受或傳回interface{}類型的函數,我們可以定義一個以func(interface{})interface{}作為參數的裝飾器函數。

但是,不可能轉換func類型的函數(string) string 隱式轉換為 func(interface{}) interface{} 類型。這是因為函數之間的參數和返回類型機制不同。傳遞 interface{} 參數並不能保證與所有類型的兼容性。

例如,接受結構體作為參數的函數將接收該結構體的各個成員。相反,接受包含該結構的介面{}的函數將接收兩個單字:一個表示類型,一個表示指向結構的指標。

如果沒有泛型,就沒有直接的方法來實現此功能。但是,我們可以使用適配器函數作為解決方法:

// Adapter function for func(string) string to func(interface{}) interface{}
func adapter(inner func(string) string) func(interface{}) interface{} {
    return func(arg interface{}) interface{} {
        // Convert the interface{} arg to a string
        argString := arg.(string)
        // Call the inner function with the converted string
        result := inner(argString)
        // Return the result
        return result
    }
}

現在,我們可以使用適配器函數將 funcB 傳遞到裝飾器中:

fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))

以上是考慮到類型相容性限制,如何在 Go 中將任意函數作為參數傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn