Golang 在 1.18 版本支持了泛型, 在工作中还没有真正用过, 这几天研究了一下,脑子里最先想到的使用场景就是集合类型的处理。
常用的集合处理函数 map
, redude
等, 在别的语言中都是直接支持的,例如 PHP 中的 array_map
, array_reduce
。
但是 golang 之中只能使用 for 循环,现在有了泛型,让实现 map
, reduce
变的简单了, 相比使用 interface
,性能也更好。
代码实现:
func Map[T any, R any](ts []T, f func(T) R) []R {
nt := make([]R, 0, len(ts))
for _, t := range ts {
nt = append(nt, f(t))
}
return nt
}
func Reduce[T any](ts []T, f func(T, T) T, init T) T {
t := init
for _, tt := range ts {
t = f(t, tt)
}
return t
}
使用
type Person struct {
ID int
Name string
}
personList := []Person{
{ 1,"zhangsan"},
{ 2,"lisi"},
}
names := Map(personList, func(p Person) string { return p.Name })
fmt.Println(names) // [zhangsan lisi]
nums := []int{1,2,3,4}
total := Reduce(nums, func(a, b int) int {
return a+b
}, 0)
fmt.Println(total) // 10
除了 map
, reduce
还有其他的函数也可以使用泛型实现。
我自己写了一个包: https://github.com/lyuangg/mr
实现了:map
, reduce
, Contains
, ToMap
, Filter
, Diff
, Intersect
, Unique
, Merge
等函数。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.