Golang Go语言中的泛型能干什么

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


Golang Go语言中的泛型能干什么

更多关于Golang Go语言中的泛型能干什么的实战教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

更多关于Golang Go语言中的泛型能干什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 这个看起来挺全的

性能可能比 interface 好,但其实比自己直接实现要慢

当然是用来实现邪道三元运算符:

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

#5 好代码

Go 的泛型实际很残废

好思路




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

瞎搞什么混合泛型, 用 stenciling 拉低了性能, 还不如 和 C++ 一样, 一个类型生成一段代码得了, 自己编译器都默认静态链接的, 说啥不在乎二进制体积, 到了泛型这里又开始在乎二进制体积了, 谜之操作. 真想减小二进制体积, 直接类型擦除 不是更小吗

用了泛型 any ,泛型就会有运行时的,并不会比单用 any 好

能不用尽量不用 这玩意影响编译速度

以前有 TypeScript 类型体操,以后 Go 也可以有类型体操了

在Golang(Go语言)中,泛型是一种强大的工具,它为函数、类型、接口等引入了参数化多态的能力。具体来说,Go语言中的泛型能够带来以下几个关键优势:

  1. 代码复用:通过泛型,你可以编写与类型无关的代码,从而避免为每种数据类型重复实现相同的逻辑。这极大地提高了代码的可复用性和可维护性。

  2. 类型安全:泛型在编译时进行检查,确保类型参数的使用是正确和安全的。这有助于减少运行时错误,并提升程序的稳定性和可靠性。

  3. 简化代码:使用泛型可以减少模板代码的数量,使代码更加简洁和清晰。例如,你可以编写一个泛型函数来处理不同类型的切片,而无需为每个类型编写单独的函数。

  4. 提高性能:由于泛型在编译时确定类型,因此它们可以生成高效、类型特定的代码,而无需像反射那样在运行时进行类型检查和转换。

  5. 增强可读性:泛型使得代码更加通用和抽象,有助于读者更好地理解代码的意图和结构,即使他们不熟悉特定的数据类型。

总的来说,Go语言中的泛型为开发者提供了一种强大的方式来编写更加灵活、可复用和类型安全的代码。它们是现代编程语言中不可或缺的一部分,对于提高软件开发的效率和质量具有重要意义。如果你正在使用Go语言进行开发,那么掌握泛型将是一个非常有价值的技能。

回到顶部