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

2022-03-21 20:46:33 +08:00
 proxytoworld
4215 次点击
所在节点    Go 编程语言
23 条回复
txx
2022-03-21 21:03:03 +08:00
如果 IDE 是 Goland 那需要切到 EAP 版本了,最新一个稳定版虽说支持 1.18 但还是有不少泛型相关的 lint bug...
airplayxcom
2022-03-21 21:16:55 +08:00
可以的很爽。消滅了不少冗餘代碼
janxin
2022-03-21 21:23:15 +08:00
不用泛型没有什么 bug

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

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

具体支持情况可以参考:
https://github.com/golang/go/issues/50558
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
2022-03-21 23:13:16 +08:00
因为我实在太菜不知道泛型具体用途和优点。

一般情况下,除非库都到某特性非用不可了,那时候我才会主动去为了语言某个特性去特意升级到某版本。
Maboroshii
2022-03-22 00:55:24 +08:00
还有点不习惯。
到时候看看主流的几个框架会不会使用泛型重写吧,看看他们是怎么写的。
2NUT
2022-03-22 05:29:41 +08:00
@loading #9 一般做基础库会用到泛型比较多, 因为处理不同的输入类型,需要抽象为统一的泛型
sunwei0325
2022-03-22 09:30:16 +08:00
自己的项目爱咋折腾咋折腾, 公司的项目最好不要升, 你用了泛型就是绑架同事
x1aoYao
2022-03-22 09:35:46 +08:00
刚开始用上,写起来比以前舒服多了。
就是历史遗留的 map 和 slice 的泛型不在方括号内有点不统一
pkoukk
2022-03-22 09:43:15 +08:00
@loading 最常见的一个例子,你要去除某个 slice 中的重复项。这个 slice 可能是[]string ,可能是[]int ,可能是[]Int64 。。。
没有泛型的情况下,你要么给每一种数据类型写一个去重函数,要么传 interface{}进去,用反射做,这两种情况不管怎么写都蛋疼。
janxin
2022-03-22 10:56:57 +08:00
@sunwei0325 泛型怎么会绑架同事,能举个例子么...
sunwei0325
2022-03-22 11:41:36 +08:00
@janxin 暂时不想学新特性, 不想意想不到的事情耽误我正点下班 :)
datafeng
2022-03-22 15:01:42 +08:00
尝试了一下,MQTT 的库不兼容~~又退回 17 了~~
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
2022-03-22 15:11:25 +08:00
期待 1.19 ,上面提到的问题就据说会解决。
txx
2022-03-22 15:24:56 +08:00
@wwaayyaa 这个在 Goland EAP 版本已经修复了.. 这几天用下来 EAP 没什么太大的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX