如何在 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中文网其他相关文章!