The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
PureWhite

go 泛型有什么实现思路么?

  •  
  •   PureWhite ·
    PureWhiteWu · Jan 26, 2018 · 3989 views
    This topic created in 3208 days ago, the information mentioned may be changed or developed.

    有思考过,go 实现泛型确实不像 java 那么方便,毕竟 java 单继承。 除了像 C++那样大动干戈,维护一套新东西,go 还有什么思路能比较好的实现泛型,又不会性能太差么?( reflect 性能很差)

    25 replies  •  2018-01-26 23:52:25 +08:00
    est
    est
    Jan 26, 2018❤️1
    1
    1. 收购 alphabet
    2. 暴改 golang
    6ufq0VLZn0DDkL80
    6ufq0VLZn0DDkL80
    Jan 26, 2018 via Android❤️1
    2
    社区早有讨论和总结,去官方的 proposal 仓库里翻吧。
    HarrisonZ
    HarrisonZ
    Jan 26, 2018 via Android❤️1
    3
    为什么要实现泛型,使用代码生成器为每种类型生成相应的代码不可以吗
    orvice
    orvice
    Jan 26, 2018
    4
    1 代码生成
    2 反射
    q397064399
    q397064399
    Jan 26, 2018❤️2
    6
    @HarrisonZ #3 泛型其实就是方便写库的兄弟,,方便封装通用的算法, 这样代码就跟类型关系不大了,静态语言这个玩意几乎是必须的,偏偏 Golang 不支持,语言并不是越简单越好,工程实践中讲究的是取舍,C++在配合 Google 编程规范 也会成为很好的语言。
    janxin
    janxin
    Jan 26, 2018 via iPad
    7
    代码生成只是一种妥协方案,但在修改的时候非常不便,一般需要修改生成程序甚至要重新生成代码。
    反射要写很多很 trick 的代码,看着太烦,要求性能时也有很大障碍。
    泛型是一种优雅的方案。
    koebehshian
    koebehshian
    Jan 26, 2018
    8
    不可能考虑所有类型吧,所谓泛型无非在整型与浮点型之间泛,直接一律以字符串为参数,传参时把类型转成字符串,泛型函数里先 parseInt, parseFloat,再计算
    wweir
    wweir
    Jan 26, 2018 via Android
    9
    不怕死上 unsafe
    blless
    blless
    Jan 26, 2018 via iPhone
    10
    接口 跟 ducktype 不行吗…把传入传出也用接口封装起来啊
    yuchenyang1994
    yuchenyang1994
    Jan 26, 2018 via Android
    11
    不要把 java 那套 oo 带到 go 来,大多数情况下没觉得没有范型不可
    looplj
    looplj
    Jan 26, 2018 via Android
    12
    模板,但是没有元编程
    yufpga
    yufpga
    Jan 26, 2018
    13
    目前 go 不支持范型,2.0 以后计划会提供泛型支持
    initialdp
    initialdp
    Jan 26, 2018
    14
    golang 现在这样很好了,千万不要引入泛型。
    guotie
    guotie
    Jan 26, 2018
    15
    2.0 以后
    fuyufjh
    fuyufjh
    Jan 26, 2018 via Android
    16
    go 以后也不会支持了,因为 go 已经提供了对代码生成的支持
    hsuan
    hsuan
    Jan 26, 2018 via Android
    17
    千万别加什么泛型
    GeruzoniAnsasu
    GeruzoniAnsasu
    Jan 26, 2018❤️1
    18
    个人觉得泛型是静态语言特有的一种提高抽象度的方法,同时不引入额外性能开销,不用泛型也的确可以获得同样高级的抽象能力,但势必要采用动态语言那一套,typeid,反射什么的,有很多额外的数据结构需要维护,还有额外的类型擦除 /标识 /转换操作,楼上提到的一律转字符串也好 ducktype 也好都是这种思路,这种思路在开发的时候能简化很多重复业务逻辑,但开发库的时候并没什么卵用,很多标准库的实现都是出乎意料的简单暴力,因为库开发,提供的接口一定是确定的,有范围的,能传入传出什么数据本来就是库说得算,根本不怎么会需要动态类型能力,这个时候考虑的只有算法对不同类型的适配度,泛型是一个恰到好处的实现

    代码生成器,其实就是泛型的本质,对特定类型生成同样固定流程的代码,但总归是泛型的 workaround 而已,没有泛型本身那么好用
    eslizn
    eslizn
    Jan 26, 2018
    19
    @yuchenyang1994 泛型和 oo 是两码事,没有泛型编码量太大
    HarrisonZ
    HarrisonZ
    Jan 26, 2018
    20
    @q397064399 写库就不能代码生成了?
    coyove
    coyove
    Jan 26, 2018
    21
    用 unsafe.Pointer 传参可以解决一些问题,但是 caller 那边势必要写的非常难看
    传入的 struct 需要加入一个 field 表示类型,overhead 不可避免,还会引起内存对齐问题。
    beetlerx
    beetlerx
    Jan 26, 2018❤️2
    22
    让我想起了那个手动泛型的 sublime gif
    bramblex
    bramblex
    Jan 26, 2018❤️2
    23
    golang 天下第一,是世界上最好的语言。golang 的设计全都是圣经,一字不能改,golang 没有的全都是奇技淫巧,是撒旦诱惑你下地狱的。

    所以,golang 要什么泛型(手动斜眼笑
    bramblex
    bramblex
    Jan 26, 2018
    24
    @HarrisonZ

    你是不是没见过一门正常点的强类型语言?
    Comdex
    Comdex
    Jan 26, 2018
    25
    @yufpga 童鞋,你这个 2.0 实现泛型是官方消息?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   687 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 20:44 · PVG 04:44 · LAX 12:44 · JFK 15:44
    ♥ Do have faith in what you're doing.