V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ZSeptember
V2EX  ›  Go 编程语言

分享一个简单的 Go 泛型实践小项目

  •  
  •   ZSeptember · 2022-03-05 23:24:55 +08:00 · 2553 次点击
    这是一个创建于 754 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/zhenzou/executors

    Go 泛型快发布了,就想着练练手。

    虽然现在主要用 Go 了,但是还是怀念 Java 的一些东西,所以封装了一个协程池,提供一个类似 Java 的线程池的 API ,支持 future ,callback ,能够异步转同步等。

    一般情况下,其实用不上协程池,但是在需要限制并发的场景下还是有用处的,新入坑的同学可以参考参考这个项目。

    吐槽一下,Go 泛型不支持 method type param ,限制实在太大了。 虽然也可以通过 func type param 转一下,但是确实还是太丑。

    本来准备把 CompletableFuture 的 API 实现下,但是不支持 method type param 组合起来不好看,就参考 JS 简单提供一个 then ,catch API 了。

    7 条回复    2022-03-06 11:12:11 +08:00
    makdon
        1
    makdon  
       2022-03-05 23:53:58 +08:00
    限制并发的话,一个 chan 就可以了吧
    ZSeptember
        2
    ZSeptember  
    OP
       2022-03-06 00:26:22 +08:00
    @makdon chan 自然可以,Go 限制并发的基本都是基于 chan 的。在很多地方用到的话,慢慢就会想着复用,最终还是会演进成一个协程池的模样。
    makdon
        3
    makdon  
       2022-03-06 00:50:03 +08:00
    @ZSeptember 就 3 行,不至于变成协程池吧...
    mind3x
        4
    mind3x  
       2022-03-06 03:36:20 +08:00 via Android
    method 上不支持额外 type parameter 实在是太限制了
    ZSeptember
        5
    ZSeptember  
    OP
       2022-03-06 10:45:19 +08:00
    @mind3x 是的,Go 这种有反射的语言,要做泛型,用类型擦除是比较简单的,但是性能差点。现在的实现是基于模版的,支持 method type param 感觉比较难。
    ZSeptember
        6
    ZSeptember  
    OP
       2022-03-06 10:59:52 +08:00   ❤️ 4
    @makdon 简单梳理下,可能的演进方向

    https://gist.github.com/zhenzou/21f4f1e585105540050f14c8e5cd5d6a

    简单使用 chan 当然能运行,只是应该可以有更好用的 API 而已。
    makdon
        7
    makdon  
       2022-03-06 11:12:11 +08:00
    @ZSeptember 这么看起来确实更简洁了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   953 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:13 · PVG 05:13 · LAX 14:13 · JFK 17:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.