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

Golang 泛型他来了!

  •  1
     
  •   cabbage ·
    cabbagec · Jun 17, 2020 · 15914 views
    This topic created in 2333 days ago, the information mentioned may be changed or developed.
    https://blog.golang.org/generics-next-step

    官方发布了几份草案,其中 go2 的泛型可以前往 https://go2goplay.golang.org 体验
    85 replies  •  2020-07-15 02:04:29 +08:00
    yuchenyang1994
    yuchenyang1994
    Jun 17, 2020
    1
    天天喊要来了,倒是发布啊
    fiypig
    fiypig
    Jun 17, 2020
    2
    最快不是明年八月
    mijimoji
    mijimoji
    Jun 17, 2020
    3
    期待很久了
    keepeye
    keepeye
    Jun 17, 2020
    4
    1.5 要等到 8 月份发布 2 不知道何年何月了
    echo1937
    echo1937
    Jun 17, 2020
    5
    扫了一样,这还没来(发布)啊,只是更新了一下这个问题的进展。
    lewinlan
    lewinlan
    Jun 17, 2020 via Android
    6
    天天喊要来了 /吃瓜
    putaozhenhaochi
    putaozhenhaochi
    Jun 17, 2020 via Android
    7
    讨厌泛型 /Doge
    boretothee
    boretothee
    Jun 17, 2020
    8
    interface 它不香吗(手动狗头)
    jon
    jon
    Jun 17, 2020
    9
    够二啥时候出
    nimdanoob
    nimdanoob
    Jun 17, 2020
    10
    我记得 go 最初的设计 不是不考虑泛型吗
    Erskine
    Erskine
    Jun 17, 2020
    11
    非常期待
    timothyye
    timothyye
    Jun 17, 2020
    12
    Hmmmm, Go 的官方 blog 也挂了 “Black Lives Matter”
    lower
    lower
    Jun 17, 2020
    13
    赶紧出,马上学
    timothyye
    timothyye
    Jun 17, 2020
    14
    预计最早得明年 8 月了。
    The earliest that generics could be added to Go would be the Go 1.17 release, scheduled for August 2021
    maoxs2
    maoxs2
    Jun 17, 2020 via Android❤️1
    15
    那以后 struct 的带多返回值方法要是用泛型是不是就四对括号了…
    syrupofplum
    syrupofplum
    Jun 17, 2020❤️2
    16
    狼来了
    gramyang
    gramyang
    Jun 17, 2020❤️14
    17
    可想清楚了,一旦引入泛型,那么 interface{}还有 [大道至简] 可就没了
    imkerberos
    imkerberos
    Jun 17, 2020
    18
    @gramyang 不要这么打脸啊.
    securityCoding
    securityCoding
    Jun 17, 2020
    19
    @nimdanoob 官方肛不住了,哈哈
    Rwing
    Rwing
    Jun 17, 2020
    20
    和 C# 的泛型有啥区别?
    iscraft
    iscraft
    Jun 17, 2020
    21
    请问下各位大佬,官方的这个例子中:
    (s []T)是字符串切片参数,那前面的(type T)是什么意思呢 是对 s 的类型声明吗?
    求解答
    duanquanyong
    duanquanyong
    Jun 17, 2020
    22
    泛型还是有必要的,没有泛型有时候真的很麻烦
    Vegetable
    Vegetable
    Jun 17, 2020❤️1
    23
    @iscraft #21 看看这个帖子
    https://www.v2ex.com/t/676318
    300
    300
    Jun 17, 2020 via Android
    24
    明天起源 2,后天大行动,大后天 GTA6
    dbskcnc
    dbskcnc
    Jun 17, 2020
    25
    这个新的提议还是有进步的,比之前的更加融洽
    araraloren
    araraloren
    Jun 17, 2020
    26
    是这种吗 () () () () .....
    vus520
    vus520
    Jun 17, 2020
    27
    表示难受
    linghutf
    linghutf
    Jun 17, 2020 via Android
    28
    泛型怎么定义可比较呢?有点好奇
    kidlj
    kidlj
    Jun 17, 2020
    29
    "The design is fully backward compatible with Go 1" —— Go team 太疯狂了,Go 2 遥遥无期哈。
    beyondex
    beyondex
    Jun 17, 2020
    30
    .NET Core 发来贺电。
    Jirajine
    Jirajine
    Jun 17, 2020 via Android
    31
    有了泛型和简化的错误处理 golang 就基本上可以广泛使用了,但这样缝合还保持向后兼容,一致性和“哲学”都没了。
    ppphp
    ppphp
    Jun 17, 2020
    32
    一些标准容器用泛型支持就行了,再多就烦了,有泛型如果还是动态派发其实没啥意思,不过要是能 hkt,还是不错的
    hantsy
    hantsy
    Jun 17, 2020
    33
    @timothyye 英国感觉有点像文革时候一样,到处雕像被毁坏,能改变什么呢。。。
    hantsy
    hantsy
    Jun 17, 2020
    34
    Go Interface 实现不需要声明,真受不了,碰瓷式的一不留神说不定实现了某接口。。。
    Hellert
    Hellert
    Jun 17, 2020
    35
    比起泛型,还是更期待能原生支持 10 进制小数。
    hantsy
    hantsy
    Jun 17, 2020
    36
    Go Interface 实在别人费解,interface{}是个任人打扮的 XX 。
    lithbitren
    lithbitren
    Jun 17, 2020
    37
    没有泛型真的很难简洁的实现类似 py 或 rs 那种复杂迭代器,希望尽早问世
    lithbitren
    lithbitren
    Jun 17, 2020
    38
    还有有了泛型,起码标准库里好些函数方法不用提前实现一大堆接口了,比如堆的实现,每次用得实现 5 个方法,甚至不如直接手撕二叉堆,性能也不如手撕。
    wangyzj
    wangyzj
    Jun 17, 2020
    39
    interface{}不香吗
    scnace
    scnace
    Jun 17, 2020 via Android
    40
    「大道至简」的老一辈基本都快退休了🙈
    PiersSoCool
    PiersSoCool
    Jun 17, 2020❤️1
    41
    不是很明白 泛型和简洁有什么关系 有了泛型 就不简洁了吗
    没了泛型 排序代码要写多少种
    QingXuJiaZhi
    QingXuJiaZhi
    Jun 17, 2020❤️6
    42
    Go 团队真的很稳,很耐心挑选方案。

    而且他们的思路也很正确,尽量把复杂性留在 “写” 泛型那边,而在 “用” 泛型那边则尽可能简化,这个设计原则非常棒。

    比如,官方的例子 Print 函数使用了泛型,它是这样使用的:

    Print([]string{"Hello, ", "world"}) //输出 Hello, world
    Print([]int{3, 4, 5}) //输出 345

    如果不管 Print 是怎么实现的,只看它是怎么使用的,就会觉得非常简洁,而且兼容 Go 1 。
    lxml
    lxml
    Jun 17, 2020
    43
    有基本能用的泛型对于底层库第三方库都是好事,只是希望不要大幅增加编译时间就行
    huoru
    huoru
    Jun 17, 2020❤️1
    45
    想要泛型,不如来先一起做 betterGo: https://github.com/PioneerIncubator/betterGo
    rockyou12
    rockyou12
    Jun 17, 2020❤️3
    46
    不得不说,不用尖括号<>的泛型真的丑啊……虽然再丑的东西用习惯就好,但()()()()()()要是 ide 不给不同括号不同颜色我真的眼睛会花……
    joesonw
    joesonw
    Jun 17, 2020
    47
    @PiersSoCool 生成器还是能解决大部分泛型场景. 如 https://github.com/a8m/syncmap
    zjupigeon
    zjupigeon
    Jun 17, 2020
    48
    Yellow Lives Matter
    huoru
    huoru
    Jun 17, 2020
    49
    @joesonw 生成器不好做- -,可以看看我上面的项目。
    AlohaTing
    AlohaTing
    Jun 17, 2020
    50
    狼来了这么多次了,也没看见一次啊 ( doge
    whoami9894
    whoami9894
    Jun 17, 2020
    51
    不知道是不是习惯了 Cpp 的写法,这样写`func Print(type T)(s []T)`我觉得很丑
    fengjianxinghun
    fengjianxinghun
    Jun 17, 2020❤️6
    52
    @cmdOptionKana 又开始尬吹了,敢问主流泛型那个不是这样?
    janxin
    janxin
    Jun 17, 2020
    53
    @rockyou12 这个应该会的
    liulaomo
    liulaomo
    Jun 17, 2020
    54
    @cmdOptionKana

    > 而且他们的思路也很正确,尽量把复杂性留在 “写” 泛型那边,而在 “用” 泛型那边则尽可能简化

    用这边怎么设计都会很简化。关键看能不能把 “写” 泛型也给简化了,否则不是一个好设计。
    liulaomo
    liulaomo
    Jun 17, 2020
    55
    @rockyou12 为什么大家都这么追求使用尖括号呢,为什么不想着如何把自定义泛型和内置泛型的语法统一起来呢?
    fengjianxinghun
    fengjianxinghun
    Jun 17, 2020
    56
    @liulaomo 因为接收器泛型的时候可以有 4 个括号。
    liulaomo
    liulaomo
    Jun 17, 2020
    57
    @fengjianxinghun 对,我也看着一大堆()不爽,但是何必非得使用<>这种异物呢?和内置泛型统一起来不香吗?
    ica10888
    ica10888
    Jun 17, 2020 via Android
    58
    看起来是为了兼容之前的语法,希望不要成为第二个 try proposal 。
    CosimoZi
    CosimoZi
    Jun 17, 2020 via Android
    59
    恭喜 golang 终于要入类型系统的门了
    blless
    blless
    Jun 17, 2020
    60
    reddit 各种代码都出来了 反观 v 站,这就是程序员论坛吗
    ThanksSirAlex
    ThanksSirAlex
    Jun 17, 2020 via iPhone
    61
    最早都要明年 8 月
    liulaomo
    liulaomo
    Jun 17, 2020
    62
    @ica10888 编译兼容?但是语法完全不兼容。自定义泛型和内置泛型的语法完全是两套。
    shiltian
    shiltian
    Jun 17, 2020
    63
    @whoami9894 习惯了 C++ 的写法觉得其他的都丑,然而所有年轻的语言都觉得 C++ 的写法反人类…😂虽然我一直是 C++ 吹,但是我知道大部分的人都认为 C++ 的语法很反人类,比如说 lambda…
    ConradG
    ConradG
    Jun 17, 2020
    64
    别造成 py2 和 py3 级别的分裂就谢天谢地了
    prenwang
    prenwang
    Jun 17, 2020
    65
    interface 坑的一逼, 装箱拆箱跟玩魔术一样, 泛型快到碗里来
    CoderGeek
    CoderGeek
    Jun 18, 2020
    66
    好的 等出来我再转 go hhh
    Balthild
    Balthild
    Jun 18, 2020
    67
    @tianshilei1992 别偷换概念,这里「习惯了 C++ 的写法」特指 C++ 采用的这种尖括号泛型语法,你把 C++ 换成 Java 、Rust 、TypeScript 也一样成立。而年轻语言觉得「 C++ 的写法反人类」指的是 C++ 的其他特性,显然这些被批判的部分并不一定包括泛型语法。
    Trim21
    Trim21
    Jun 18, 2020 via Android
    68
    这个 go2go 工具转换出来的代码是什么样子的…
    islxyqwe
    islxyqwe
    Jun 18, 2020
    69
    func Map(type T, M)(f func(T) M, s []T) []M {
    result := make([]M, len(s))
    for k, v := range s {
    result[k] = f(v)
    }
    return result
    }

    func main() {
    Print(Map(func(a int64) string { return strconv.FormatInt(a, 16) }, []int64{42, 100, 200}))
    }


    还可以,处理数据总算能写的简洁点了
    jmyz0455
    jmyz0455
    Jun 18, 2020
    70
    go2 快来了,怕是又有一波降级
    35aZ4P8mT576683q
    35aZ4P8mT576683q
    Jun 18, 2020 via Android
    71
    恭喜,程序可读性将会一去不复返
    asche910
    asche910
    Jun 18, 2020
    72
    interface 又不是不能用(狗头)
    FrankHB
    FrankHB
    Jun 18, 2020❤️1
    73
    @rockyou12 <>是病,得治。
    这种 angle bracket 的习惯来自数学符号,正宗写法是 chevron ( ⟨ ⟩ ),只是在只有基本字符集支持的语言中才复用了大于小于号(<>)。结果词法歧义上就炸了……(看看 C++ >>。)
    没看到歧义还觉得不丑,说明基本的实用审美已经被整得退化了。
    技术上这种东西还真不如 () 加 tag,因为用 () 在文法歧义之前已经直接承认语义上的潜在歧义,因此正常的设计中会更积极地消歧义(如通过另外加关键字)。
    无条件混用 <> 仍然是垫底的弟弟设计。
    FrankHB
    FrankHB
    Jun 18, 2020
    74
    @Balthild C++ 反人类的设计显然包括不知所谓的本该避免的文法歧义,使用 <> 多出来的问题就是 C++ 反人类设计的典型杰出代表之一,这不因为其它问题更拉仇恨而改变。你没有一下子搞清楚这点,而强调“并不一定”,看来是不够熟悉 C++ 。(事实是,不想硬抄 instantiation phase 而老实写形式语法的根本没法在实用上绕过这坨○。)
    虽然其它许多用 <> 的语言并没有那么夸张的歧义问题,但是用 <> 的必要性仍然相当莫名其妙,有不尊重语用来源之嫌。
    选择照抄 C++ 这样设计的语言设计者和语言的用户,大概也不一定了解 C++ 在这方面的历史包袱。而选择不照抄 C++ 却同样使用这种糟粕设计的语言设计者,大概至少一样无可救药(至少没几个语言有当初 C++ 对 basic source character set 那么纠结的需求,也不是事后才扩展出 template 的)。
    Darain
    Darain
    Jun 18, 2020
    75
    我最早看到 golang 2.0 说要支持泛型还是在 8102 年
    releaseme
    releaseme
    Jun 18, 2020
    76
    @cmdOptionKana 下意识觉得你在黑 Go,再读一遍又觉得不对
    allenhu
    allenhu
    Jun 18, 2020 via Android
    77
    该有的你还得有 doge
    gravitybox
    gravitybox
    Jun 18, 2020
    78
    func Print(type T)(s []T) (int, string){
    return 0, ""
    }

    这括号也太多了吧
    rockyou12
    rockyou12
    Jun 18, 2020
    79
    @FrankHB 你说这些有啥用 lisp 、Haskell 美不美?搬砖好不好用?
    notamail
    notamail
    Jun 18, 2020
    80
    @lithbitren 你可以看看 container/list
    lithbitren
    lithbitren
    Jun 18, 2020 via iPhone
    81
    @notamail list 还好吧,而且队列手写也好写啊,直接用数组性能比 list 快几倍,我说的是 container/heap
    qW7bo2FbzbC0
    qW7bo2FbzbC0
    Jun 18, 2020
    82
    当初夸 go 不加泛型和官方秉承简洁不多加功能的人会不会回去改掉他们的文章
    einsdisp
    einsdisp
    Jun 19, 2020
    83
    泛型是 golang 最大的痛点(没有之一)。

    golang 其他为人诟病的地方(比如错误处理,比如黑魔法太少),大约可归类为习惯问题,if err != nil 只是写法不一样,习惯之后,也足够用了,何况 goland 对于未处理的错误会标黄提示。

    但是没有泛型这个实在不能忍,不仅代码丑陋,而且缺少类型提示与编译期错误检查(如果使用 interface{}、反射来曲线救国),运行时性能损失倒无所谓,绝大多数 golang 项目性能绝非瓶颈。

    golang 官方从一开始就说没有泛型只是不好实现(怕拖慢编译速度),而不是彻底不考虑未来加入泛型的可能。

    根据[golang 官方的开发者调查]( https://blog.golang.org/survey2019-results):

    > Among the 25% of respondents who said Go lacks language features they need, 79% pointed to generics as a critical missing feature

    对于语言特性缺失的调查,其中 79%都指向缺少泛型
    chai2010
    chai2010
    Jun 23, 2020
    84
    看各个群里和论坛的评论,对 Go2 都是褒贬不一。
    我想说的是,这是别人的语言,不可能 100%符合自己的口味,美帝不卡你脖子已经够意思了。

    如果真不爽,就直接操刀 ast 搞一个自己的定制语言。
    gofmt 和 golint 检查也是基于 ast 做分析。
    基于 ast 可以扩展出新的语法来,比如七牛面向数据科学语言的 Go+语言。

    可以简单看看这本书:《 Go 语法树入门——开启自制编程语言和编译器之旅!》( github 地址:chai2010/go-ast-book ),
    其实也就是把 ast 包里的代码简单讲讲。

    当然为了写这个书,我们也定制了一个凹语言:目前已经是一个可以嵌入 Go 语言的脚本语言,
    也是基于 Go 语言的 ast 定制,在语言的基本功能完成之后我们会公开代码。
    Balthild
    Balthild
    Jul 15, 2020
    85
    @FrankHB 对嘛,你也说了,反人类的不是 <> 语法本身,而是 C++ 为了使用 <> 而多出来的问题。像 Java 、TypeScript 等语言也用 <> 语法表示泛型,但它并没有 C++ 这些反人类的问题。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5193 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 169ms · UTC 06:27 · PVG 14:27 · LAX 22:27 · JFK 01:27
    ♥ Do have faith in what you're doing.