如何在 Go 中建立具有不同簽章的函式切片?
Go 的型別系統是靜態型別的,這表示函數在編譯時必須有固定的簽章。但是,建立可以接受不同類型或數字參數的函數切片可能會很有用。
雖然提供的程式碼可以正常運行,但它需要使用 switch 語句來處理每個函數簽章類型。更簡潔靈活的解決方案是使用反射。
下面是一個範例:
package main import ( "fmt" "reflect" ) type Executor func(...interface{}) func main() { functions := []Executor{ func(a, b int) { fmt.Println(a + b) }, func(s string) { fmt.Println(s) }, func() { fmt.Println("No arguments") }, } for _, f := range functions { numIn := reflect.TypeOf(f).NumIn() args := make([]reflect.Value, numIn) for i := 0; i < numIn; i++ { switch reflect.TypeOf(f).In(i).Kind() { case reflect.Int: args[i] = reflect.ValueOf(12) case reflect.String: args[i] = reflect.ValueOf("Hello") default: args[i] = reflect.Value{} } } f.Call(args) } }
在這個解中,我們建立了一片 Executor 函數,這些函數可以接受任意數量的論點。 Reflect套件用於確定每個函數期望的參數數量和類型,並產生相應的reflect.Value切片。
使用反射允許我們動態呼叫具有不同簽名的函數,而不需要類型切換或介面{}切片。
以上是如何在 Go 中建立具有不同簽名的函數切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!