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 · 4169 次点击
    这是一个创建于 962 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   993 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:48 · PVG 04:48 · LAX 12:48 · JFK 15:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.