問題:
在Golang 中建立具有不同簽章的函數切片是具有挑戰性的。使用提供的程式碼片段,該方法看起來有些「hacky」。是否有必要使用interface{}切片作為解決方法?
解決方案:
使用interface{}切片確實是創建包含函數的切片的有效解決方案具有不同的簽名。然而,另一種方法涉及利用反射來動態確定每個函數的輸入參數的數量和類型。
以下是展示反射用法的替代代碼範例:
package main import ( "fmt" "reflect" ) func A() { fmt.Println("A") } func B(a int) { fmt.Println("B", a) } func C(a string, b float32) { fmt.Println("C", a, b) } func main() { f := []interface{}{A, B, C} for _, v := range f { fn := reflect.ValueOf(v) fmt.Printf("Function: %v\n", fn.Type()) numArgs := fn.Type().NumIn() fmt.Printf("Number of arguments: %v\n", numArgs) for i := 0; i < numArgs; i++ { argType := fn.Type().In(i) fmt.Printf("Arg %v Type: %v\n", i+1, argType) } fmt.Printf("Calling function using reflection...\n") callArgs := []reflect.Value{} for i := 0; i < numArgs; i++ { switch fn.Type().In(i).Kind() { case reflect.Int: callArgs = append(callArgs, reflect.ValueOf(i+1)) case reflect.String: callArgs = append(callArgs, reflect.ValueOf(fmt.Sprintf("Arg-%v", i+1))) case reflect.Float32: callArgs = append(callArgs, reflect.ValueOf(float32(i+1))) } } fn.Call(callArgs) } }
這種方法透過反射提供對各個函數參數(類型和值)的直接訪問,從而允許更動態地處理具有不同簽名的函數片段。
以上是如何有效管理 Go 中具有不同簽章的函數片段?的詳細內容。更多資訊請關注PHP中文網其他相關文章!