Golang 的泛型能干什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yuancoder

Golang 的泛型能干什么

  •  
  •   yuancoder 2023 年 9 月 3 日 3903 次点击
    这是一个创建于 964 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    13 条回复    2023-09-12 11:27:12 +08:00
    chotow
        1
    chotow  
       2023 年 9 月 3 日   4
    yuancoder
        2
    yuancoder  
    OP
       2023 年 9 月 3 日
    @chotow #1 这个看起来挺全的
    Nasei
        3
    Nasei  
       2023 年 9 月 3 日   2
    性能可能比 interface 好,但其实比自己直接实现要慢
    lllllliiii
        4
    lllllliiii  
       2023 年 9 月 3 日   1
    Contextualist
        5
    Contextualist  
       2023 年 9 月 3 日   7
    当然是用来实现邪道三元运算符:

    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
        6
    hsfzxjy  
       2023 年 9 月 3 日 via Android   1
    yuancoder
        7
    yuancoder  
    OP
       2023 年 9 月 3 日
    @Contextualist #5 好代码
    Aloento
        8
    Aloento  
       2023 年 9 月 3 日
    Go 的泛型实际很残废
    wangdk23411
        9
    wangdk23411  
       2023 年 9 月 3 日
    @Contextualist 好思路
    bruce0
        10
    bruce0  
       2023 年 9 月 4 日   1
    @hsfzxjy
    @Aloento

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

    瞎搞什么混合泛型, 用 `stenciling` 拉低了性能, 还不如 和 C++ 一样, 一个类型生成一段代码得了, 自己编译器都默认静态链接的, 说啥不在乎二进制体积, 到了泛型这里又开始在乎二进制体积了, 谜之操作. 真想减小二进制体积, 直接类型擦除 不是更小吗
    lysS
        11
    lysS  
       2023 年 9 月 4 日
    用了泛型 any ,泛型就会有运行时的,并不会比单用 any 好
    voidmnwzp
        12
    voidmnwzp  
       2023 年 9 月 5 日 via iPhone
    能不用尽量不用 这玩意影响编译速度
    beichenshao
        13
    beichenshao  
       2023 年 9 月 12 日
    以前有 TypeScript 类型体操,以后 Go 也可以有类型体操了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3046 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 89ms UTC 02:30 PVG 10:30 LAX 19:30 JFK 22:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86