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