V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
PureWhite

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

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

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

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

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