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