在 Go 中按類型選擇函數
考慮這樣一個場景,您有一個不同類型的函數數組或切片。為了有效地處理這些函數,您可能只想選擇傳回或接收特定類型資料(例如整數)的函數。這可以使用 Go 反射包來實現。
反射套件提供了在運行時自省值類型的方法。透過檢查函數的輸入和輸出類型,您可以篩選出符合您條件的類型。
考慮以下範例程式:
<code class="go">package main import ( "fmt" "reflect" ) func main() { funcs := make([]interface{}, 3, 3) // I use interface{} to allow any kind of func funcs[0] = func(a int) int { return a + 1 } // good funcs[1] = func(a string) int { return len(a) } // good funcs[2] = func(a string) string { return ":(" } // bad for _, fi := range funcs { f := reflect.ValueOf(fi) functype := f.Type() good := false for i := 0; i < functype.NumIn(); i++ { if "int" == functype.In(i).String() { good = true // yes, there is an int among inputs break } } for i := 0; i < functype.NumOut(); i++ { if "int" == functype.Out(i).String() { good = true // yes, there is an int among outputs break } } if good { fmt.Println(f) } } }</code>
在此程式中,我們建立一個函數切片 ([]interface{}) 用於儲存不同類型的函數。然後我們迭代這個切片,對於每個函數,我們使用反射來取得其類型(reflect.ValueOf(fi).Type())。透過檢查輸入和輸出類型,我們可以確定函數是否符合我們的標準。在這種情況下,我們檢查接收或傳回整數的函數。如果找到這樣的函數,它將列印到輸出中。
反射套件提供了一個強大的機制來內省 Go 值,包括函數。透過利用此功能,您可以在運行時根據函數的類型過濾掉函數,從而實現高效靈活的程式碼操作。
以上是如何使用 Go 反射根據輸入和輸出類型選擇函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!