go1.18 泛型体验如何,咋考虑要不要从 17 升上去,有啥 bug 吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
proxytoworld
V2EX    Go 编程语言

go1.18 泛型体验如何,咋考虑要不要从 17 升上去,有啥 bug 吗

  •  
  •   proxytoworld 2022-03-21 20:46:33 +08:00 4604 次点击
    这是一个创建于 1357 天前的主题,其中的信息可能已经有所发展或是发生改变。
    23 条回复    2022-04-04 01:54:39 +08:00
    txx
        1
    txx  
       2022-03-21 21:03:03 +08:00
    如果 IDE 是 Goland 那需要切到 EAP 版本了,最新一个稳定版虽说支持 1.18 但还是有不少泛型相关的 lint bug...
    airplayxcom
        2
    airplayxcom  
       2022-03-21 21:16:55 +08:00
    可以的很爽。消了不少冗代
    janxin
        3
    janxin  
       2022-03-21 21:23:15 +08:00
    不用泛型没有什么 bug

    有用泛型的话,一些 linter 支持有问题
    masterclock
        4
    masterclock  
       2022-03-21 21:53:55 +08:00
    还没用上泛型,不过 workspace 真香
    BeautifulSoap
        5
    BeautifulSoap  
       2022-03-21 21:59:56 +08:00
    1. IDE 方面,goland EAP 对泛型的支持还有很多 bug ,该检测出的语法错误没有被检测出来,正确的语法被视为错误标红之类
    2. 很多人没意识到这次的泛型给 Go 语言增加多少复杂度。Go1.18 为了支持泛型引入了一大堆新的概念,也对包括接口、类型之类已经存在的概念定义做了大幅修改,同时还引入了一大堆非常非常细碎的规则限制(细碎到很多 linter 都还没能做到正确检测)
    3. 至于语言层面的 bug 因为才刚发布不久并没有遇到
    4. 用泛型写数据结构、通用工具函数是真的爽
    proxytoworld
        6
    proxytoworld  
    OP
       2022-03-21 22:05:21 +08:00
    @BeautifulSoap
    @janxin
    @txx

    官方插件也有 bug ?
    janxin
        7
    janxin  
       2022-03-21 22:11:38 +08:00
    @proxytoworld gopls 部分功能不支持,但是仅限于使用泛型语法的部分功能。

    具体支持情况可以参考:
    https://github.com/golang/go/issues/50558
    janxin
        8
    janxin  
       2022-03-21 22:18:49 +08:00
    @BeautifulSoap 其实 2 的问题主要来源是 x/tools/go/ssa 的泛型支持,这个是目前各大 linter 支持泛型最大的 blocker 。

    具体的 track 可以参考,从目前看甚至已经推迟到 1.19 了
    https://github.com/golang/go/issues/48525
    loading
        9
    loading  
       2022-03-21 23:13:16 +08:00
    因为我实在太菜不知道泛型具体用途和优点。

    一般情况下,除非库都到某特性非用不可了,那时候我才会主动去为了语言某个特性去特意升级到某版本。
    Maboroshii
        10
    Maboroshii  
       2022-03-22 00:55:24 +08:00 via Android
    还有点不习惯。
    到时候看看主流的几个框架会不会使用泛型重写吧,看看他们是怎么写的。
    2NUT
        11
    2NUT  
       2022-03-22 05:29:41 +08:00
    @loading #9 一般做基础库会用到泛型比较多, 因为处理不同的输入类型,需要抽象为统一的泛型
    sunwei0325
        12
    sunwei0325  
       2022-03-22 09:30:16 +08:00
    自己的项目爱咋折腾咋折腾, 公司的项目最好不要升, 你用了泛型就是绑架同事
    x1aoYao
        13
    x1aoYao  
       2022-03-22 09:35:46 +08:00
    刚开始用上,写起来比以前舒服多了。
    就是历史遗留的 map 和 slice 的泛型不在方括号内有点不统一
    pkoukk
        14
    pkoukk  
       2022-03-22 09:43:15 +08:00
    @loading 最常见的一个例子,你要去除某个 slice 中的重复项。这个 slice 可能是[]string ,可能是[]int ,可能是[]Int64 。。。
    没有泛型的情况下,你要么给每一种数据类型写一个去重函数,要么传 interface{}进去,用反射做,这两种情况不管怎么写都蛋疼。
    janxin
        15
    janxin  
       2022-03-22 10:56:57 +08:00
    @sunwei0325 泛型怎么会绑架同事,能举个例子么...
    sunwei0325
        16
    sunwei0325  
       2022-03-22 11:41:36 +08:00
    @janxin 暂时不想学新特性, 不想意想不到的事情耽误我正点下班 :)
    datafeng
        17
    datafeng  
       2022-03-22 15:01:42 +08:00
    尝试了一下,MQTT 的库不兼容~~又退回 17 了~~
    wwaayyaa
        18
    wwaayyaa  
       2022-03-22 15:10:38 +08:00
    goland 的提示还不能完全识别,对于复杂的泛型定义,然后你在一些方法上面会遇到标红,但是实际跑测试没有问题。
    如下
    XXX[T ~map[K]V, K conparable, V any]
    后来干脆改成简单的,也能正常工作。
    XXX[ K conparable, V any]

    还有一些不能支持的使用方法,对于结构体的方法,不能额外再返回新的类型,除非单独写一个普通的函数。
    func(x XX[T]) Foo[T, K any](){}
    wwaayyaa
        19
    wwaayyaa  
       2022-03-22 15:11:25 +08:00
    期待 1.19 ,上面提到的问题就据说会解决。
    txx
        20
    txx  
       2022-03-22 15:24:56 +08:00
    @wwaayyaa 这个在 Goland EAP 版本已经修复了.. 这几天用下来 EAP 没什么太大的问题
    woohaha
        21
    woohaha  
       2022-03-22 22:06:44 +08:00   1
    自从 golang 出了 1.18 ,我就润去 kotlin 了
    veightz
        22
    veightz  
       2022-03-31 13:11:35 +08:00
    虽然升到了 18, 但是还没用上泛型语法.. 感觉还行...
    aliipay
        23
    aliipay  
       2022-04-04 01:54:39 +08:00
    @wwaayyaa 嗯,那时候可能没有泛型了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     806 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:58 PVG 03:58 LAX 11:58 JFK 14:58
    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