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

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

  •  
  •   PureWhite ·
    PureWhiteWu · 2018-01-26 00:06:35 +08:00 · 3064 次点击
    这是一个创建于 2531 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    所以,golang 要什么泛型(手动斜眼笑
    bramblex
        24
    bramblex  
       2018-01-26 13:22:07 +08:00
    @HarrisonZ

    你是不是没见过一门正常点的强类型语言?
    Comdex
        25
    Comdex  
       2018-01-26 23:52:25 +08:00
    @yufpga 童鞋,你这个 2.0 实现泛型是官方消息?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1090 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:00 · PVG 07:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.