
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 等函数。
1 chotow 2023 年 9 月 3 日 |
3 Nasei 2023 年 9 月 3 日 性能可能比 interface 好,但其实比自己直接实现要慢 |
4 lllllliiii 2023 年 9 月 3 日 |
5 Contextualist 2023 年 9 月 3 日 当然是用来实现邪道三元运算符: func tern[T any](cond bool, a T, b T) T { if cond { return a } return b } var x, y int x = tern(true, 42, 1) *tern(false, &x, &y) = 42 |
6 hsfzxjy 2023 年 9 月 3 日 via Android |
7 yuancoder OP @Contextualist #5 好代码 |
8 Aloento 2023 年 9 月 3 日 Go 的泛型实际很残废 |
9 wangdk23411 2023 年 9 月 3 日 @Contextualist 好思路 |
10 bruce0 2023 年 9 月 4 日 |
11 lysS 2023 年 9 月 4 日 用了泛型 any ,泛型就会有运行时的,并不会比单用 any 好 |
12 voidmnwzp 2023 年 9 月 5 日 via iPhone 能不用尽量不用 这玩意影响编译速度 |
13 beichenshao 2023 年 9 月 12 日 以前有 TypeScript 类型体操,以后 Go 也可以有类型体操了 |