Golang 的泛型能干什么

248 天前
 yuancoder

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 等函数。

2874 次点击
所在节点    Go 编程语言
13 条回复
chotow
248 天前
yuancoder
248 天前
@chotow #1 这个看起来挺全的
Nasei
248 天前
性能可能比 interface 好,但其实比自己直接实现要慢
fzdwx
248 天前
Contextualist
248 天前
当然是用来实现邪道三元运算符:

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
hsfzxjy
248 天前
yuancoder
248 天前
@Contextualist #5 好代码
Aloento
248 天前
Go 的泛型实际很残废
wangdk23411
248 天前
@Contextualist 好思路
bruce0
247 天前
@hsfzxjy
@Aloento

刚出来的时候, 我也看过一篇文章, 详细分析了 go 泛型的实现. 确实残废. 而且不支持 方法 泛型

瞎搞什么混合泛型, 用 `stenciling` 拉低了性能, 还不如 和 C++ 一样, 一个类型生成一段代码得了, 自己编译器都默认静态链接的, 说啥不在乎二进制体积, 到了泛型这里又开始在乎二进制体积了, 谜之操作. 真想减小二进制体积, 直接类型擦除 不是更小吗
lysS
247 天前
用了泛型 any ,泛型就会有运行时的,并不会比单用 any 好
voidmnwzp
246 天前
能不用尽量不用 这玩意影响编译速度
beichenshao
239 天前
以前有 TypeScript 类型体操,以后 Go 也可以有类型体操了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970485

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX