如何解决如何实现通用过滤器功能?
假设我在 Golang 中实现了这个用于过滤 Slice 的函数:
func Filter(filter func(n int) bool) func(list []int) []int {
return func(list []int) []int {
r := make([]int,0)
for _,n := range list {
if filter(n) {
r = append(r,n)
}
}
return r
}
}
像这样使用:
list := []int{1,4,3,2,7,9,7}
r := Filter(func(n int) bool { return n > 3 })(list)
fmt.Println(r)
这没问题,但我有以下问题:
- 我应该使用完整的 func 语法而不是 lambda 风格的表达式吗?
- 如果我想让我的过滤器过滤任何类型的切片,我应该使用什么返回类型?
谢谢!
解决方法
-
据我所知,还没有接受更简洁的匿名函数表示法(“lambda”)的提议。
-
计划在 2022 年初随着 Go 1.18 的发布向该语言添加 type parameters(又名泛型)。然后,您就可以编写下面的程序 (playground)。
如果你能等到那时,那就去做。无论如何,通常不鼓励使用 using the
reflect
package 和 peppering one's code with the emptyinterface{}
and type assertions。在 Go 1.18 之前,一种可行的替代方法是使用go generate
生成您需要的不同特化(对于int
、string
等)。package main import "fmt" func Filter[T any](filter func(n T) bool) func(T []T) []T { return func(list []T) []T { r := make([]T,len(list)) for _,n := range list { if filter(n) { r = append(r,n) } } return r } } func main() { list := []int{1,4,3,2,7,9,7} r := Filter(func(n int) bool { return n > 3 })(list) fmt.Println(r) list2 := []string{"foo","bar","baz","qux","quux"} r2 := Filter(func(s string) bool { return len(s) <= 3 })(list2) fmt.Println(r2) }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。