GO 2 设计草案公布了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
feiyuanqiu
V2EX    Go 编程语言

GO 2 设计草案公布了

  •  1
     
  •   feiyuanqiu 2018-08-29 10:37:51 +08:00 9027 次点击
    这是一个创建于 2665 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://go.googlesource.com/proposal/+/master/design/go2draft.md

    主要涉及社区呼声最高的痛点:泛型,错误处理。 但是习惯了 Java,看这个语法感觉有点奇怪...

    第 1 条附言    2018-08-29 11:18:29 +08:00

    Error Handling

    // 使用现在的错误处理方式 func CopyFile(src, dst string) error { r, err := os.Open(src) if err != nil { return fmt.Errorf("copy %s %s: %v", src, dst, err) } defer r.Close() w, err := os.Create(dst) if err != nil { return fmt.Errorf("copy %s %s: %v", src, dst, err) } if _, err := io.Copy(w, r); err != nil { w.Close() os.Remove(dst) return fmt.Errorf("copy %s %s: %v", src, dst, err) } if err := w.Close(); err != nil { os.Remove(dst) return fmt.Errorf("copy %s %s: %v", src, dst, err) } } // 使用 GO 2 草案中的错误处理方式 func CopyFile(src, dst string) error { handle err { return fmt.Errorf("copy %s %s: %v", src, dst, err) } r := check os.Open(src) defer r.Close() w := check os.Create(dst) handle err { w.Close() os.Remove(dst) // (only if a check fails) } check io.Copy(w, r) check w.Close() return nil } 

    Generics

    // Definition type List(type T) []T func Keys(type K, V)(m map[K]V) []K // Usage var ints List(int) keys := Keys(int, string)(map[int]string{1:"one", 2: "two"}) // Bounded Type Parameters contract Equal(t T) { t == t } type Set(type T Equal) []T func (s Set(T)) Find(x T) int { for i, v := range s { if v == x { return i } } return -1 } 
    52 条回复    2019-04-22 10:37:44 +08:00
    wenzhoou
        1
    wenzhoou  
       2018-08-29 10:54:29 +08:00 via Android
    以后代码每一行都要加一个 check 罗。
    zhs227
        2
    zhs227  
       2018-08-29 11:00:28 +08:00   1
    ```
    func main() {
    handle err {
    log.Fatal(err)
    }

    hex := check ioutil.ReadAll(os.Stdin)
    data := check parseHexdump(string(hex))
    os.Stdout.Write(data)
    }
    ```

    我觉得不如 Rust 的?宏简单。
    hex := ioutil.ReadAll(os.Stdin)?
    data := parseHexdump(string(hex))?

    多好。
    GO 不支持 3 目运算符,所以问号应该也是可以使用的。
    feiyuanqiu
        3
    feiyuanqiu  
    OP
       2018-08-29 11:07:35 +08:00
    V 站不能编辑主题,也不能 append...

    简单搬运一些草案中的新的语法设计

    BBCCBB
        4
    BBCCBB  
       2018-08-29 11:14:32 +08:00
    丑拒.
    zn
        5
    zn  
       2018-08-29 11:32:59 +08:00   10
    我一直拒绝 Go 的原因就是语法太 tmd 丑了,越写越想吐槽,越写越难受。
    XIVN1987
        6
    XIVN1987  
       2018-08-29 11:35:30 +08:00
    感觉这错误处理还不如 try...cache/except 好看,,有点儿丑,,
    loongwang
        7
    loongwang  
       2018-08-29 11:39:05 +08:00 via Android
    有点难受
    bobuick
        8
    bobuick  
       2018-08-29 11:40:02 +08:00
    真 jb 丑。虽然我用了很多 go。
    error 处理要么就粗暴搞成跟人家 java 一样的, 要么就学 rust 那类学院点。

    三元语法没有,也叫草案。
    MeteorCat
        9
    MeteorCat  
       2018-08-29 11:43:44 +08:00
    说实话真的不如`try...cache/except`好看
    PureWhiteWu
        10
    PureWhiteWu  
       2018-08-29 11:47:39 +08:00
    @MeteorCat
    @XIVN1987
    try cache 是啥?
    我只用过 try catch
    8023
        11
    8023  
       2018-08-29 11:48:36 +08:00 via Android
    先把函数参数默认值加上再说别的...
    MeteorCat
        12
    MeteorCat  
       2018-08-29 11:48:52 +08:00
    @PureWhiteWu 完了,复制黏贴丢脸了
    anying
        13
    anying  
       2018-08-29 11:49:28 +08:00
    真。。。丑拒
    danc
        14
    danc  
       2018-08-29 12:27:25 +08:00
    @zhs227 对的,还是觉得 rust 的宏好用
    KevinAce
        15
    KevinAce  
       2018-08-29 12:54:07 +08:00
    错误处理和没改一样
    sampeng
        16
    sampeng  
       2018-08-29 12:55:03 +08:00
    真心需要 rust 的那个宏啊。。好用到爆炸啊。。。
    go 没有宏多写多少代码啊。。。
    3d3ec7a
        17
    3d3ec7a  
       2018-08-29 13:15:10 +08:00   4
    公司在用 go. 这玩意儿各种语意不一致, 自相矛盾. 工程师拍脑门想出来的东西不靠谱. 还是要学术界的人设计才行.
    dodo2012
        18
    dodo2012  
       2018-08-29 13:21:35 +08:00
    语法真的是,,怎么说,虽然觉得 rust 语法真难学,但这个就,,简单是简单,但是太丑了吧
    prolic
        19
    prolic  
       2018-08-29 13:26:13 +08:00 via Android
    丑拒,要改成这样我有概率会转化成 go1 死忠了
    michaelcheng
        20
    michaelcheng  
    /div>   2018-08-29 13:30:49 +08:00
    感觉这样处理错误还不是很爽
    duanquanyong
        21
    duanquanyong  
       2018-08-29 13:44:05 +08:00   2
    其实如果觉得 rust 好,如果什么都要跟 rust 一样,为什么不直接用 rust 呢。。。。。。
    duanquanyong
        22
    duanquanyong  
       2018-08-29 13:51:16 +08:00   2
    很多人吐槽错误处理机制,我倒是觉得这种挺好的,这种错误处理方式虽然看起来丑,其实跟 defer 和 panic 的处理方式是一样的,同时能更好地兼容以前的代码,如果用 try...catch 那基本 go1 那跟以前的代码没办法兼容,到时候 go1 的库 go2 用不了,才会真正割裂吧
    YingJie
        23
    YingJie  
       2018-08-29 13:51:51 +08:00 via Android   3
    golang 的语法真的受不了,非要标新立异,越写越难受,比这更难受的是一部分 go 吹,无脑崇拜。
    merin96
        24
    merin96  
       2018-08-29 13:55:05 +08:00
    这他妈还不如不改
    reus
        25
    reus  
       2018-08-29 13:58:46 +08:00
    v2ex 里的无脑黑都来了,帖子里充满了快活的气氛
    natscat
        26
    natscat  
       2018-08-29 14:11:03 +08:00
    慢慢就习惯了
    PythonAnswer
        27
    PythonAnswer  
       2018-08-29 14:13:16 +08:00 via iPhone   1
    check 切克闹 煎饼 go 子来一套
    vincenteof
        28
    vincenteof  
       2018-08-29 14:23:10 +08:00
    发表一点主观的看法,这语法是我所有学过的语言里最丑的
    dhssingle
        29
    dhssingle  
       2018-08-29 14:32:19 +08:00
    每一行都要 check ?蛋疼
    specita
        30
    specita  
       2018-08-29 14:40:20 +08:00
    感觉错误处理那里并没有减少多少代码量。。
    ChristopherWu
        31
    ChristopherWu  
       2018-08-29 14:40:49 +08:00
    曾经的 golang 『粉』,现在觉得 golang 真鸡儿丑。
    设计的也不优雅,改了 handle error,想方便一些是好事-_-
    还是觉得有点丑..
    Hellert
        32
    Hellert  
       2018-08-29 14:44:42 +08:00
    这个错误处理方式违反直觉,正常思维先发生操作,后处理错误,这个设计是把错误处理放到代码最前面了。

    泛型语法可以接受,但为什么不直接用<>而用 type 关键字,尖括号更简单点吧。
    fatedier
        33
    fatedier  
       2018-08-29 15:11:57 +08:00   1
    Feedback. The most useful general feedback would be examples of interesting uses that are enabled or disallowed by the draft design. We ’ d also welcome feedback about the points above, especially based on experience with complex or buggy error handling in real programs.

    We are collecting links to feedback at golang.org/wiki/Go2ErrorHandlingFeedback.

    与其一句话吐槽,不如各抒己见,贡献自己的 idea.
    crazyneo
        34
    crazyneo  
       2018-08-29 15:22:35 +08:00
    那个错误处理什么金箔语法,每个可能出错的地方我都得加 check ?还不如 c-style 的返回值判断,rust 那种也可以啊。
    至于楼上说 exception 的,考虑过 C++的 exception 里到底多少坑?完全违反 RAII 的基本内存管理原则,这玩意能让你从程序的 memory leak 和 crsh 变成人 memory leak 和 crash,Java 之类有虚拟机兜底还稍微好点。Go 号称贴近底层,runtime 的 gc 编译进去就已经很蛋疼了,还要帮你兜底异常?
    darluc
        35
    darluc  
       2018-08-29 15:51:35 +08:00
    毕竟只是个 draft,这些痛点如果能改好,觉得很不错!
    asuraa
        36
    asuraa  
       2018-08-29 15:53:10 +08:00
    真丑
    haozes
        37
    haozes  
       2018-08-29 15:58:40 +08:00
    这错误处理什么鬼,先写异常处理,再 check,什么直觉。。。
    liuxey
        38
    liuxey  
       2018-08-29 16:15:52 +08:00
    可以,这很 Go,一眼看上去,这一堆啥啊!
    写几个 handle,一个个 check, 最后可能还要 defer , 中间穿插着 return,迷宫呢这是
    XIVN1987
        39
    XIVN1987  
       2018-08-29 17:14:45 +08:00
    看到大家都说丑我就放心了,,我的审美没啥问题(*^^*)
    yuekcc
        40
    yuekcc  
       2018-08-29 19:48:14 +08:00
    没有人吐嘈泛型的语法吗,为嘛这个另类。
    owenliang
        42
    owenliang  
       2018-08-29 20:28:48 +08:00 via Android
    这个语法是有点。。。 哪个家伙想出来的
    luozic
        43
    luozic  
       2018-08-29 20:50:30 +08:00 via iPhone
    为啥不学 python 的 meta 或者 C#的模式匹配? 就是 C++古老的模版也比这好看吧
    qianlifeng
        44
    qianlifeng  
       2018-08-29 23:21:35 +08:00
    Error Handling 是真丑,没了一堆 if err != nil 引入了一堆的 check handler,关键是 handler 还现在前面,读代码的时候先看到错误处理,一脸懵逼,然后再往下看才知道原始是处理这个。。。
    kidlj
        45
    kidlj  
       2018-08-30 00:01:11 +08:00 via iPhone
    Go 的错误处理,丑但是正确。
    georgetso
        46
    georgetso  
       2018-08-30 00:13:13 +08:00
    的确丑, 没法洗地
    PythonAnswer
        47
    PythonAnswer  
       2018-08-30 00:44:52 +08:00
    防御性编程,上来先想到出错的地方,所谓御敌千里之外是也。

    不过我一直不喜欢写 go,是因为他非要用 tab。
    aa6563679
        48
    aa6563679  
       2018-08-30 08:40:29 +08:00 via iPhone
    go 语言是 c 的改进版,这样想就不觉得丑了
    gowk
        49
    gowk  
       2018-08-30 09:52:00 +08:00
    为什么我觉得很美呢。。哦对了,我是无脑 Go 吹
    nocrush
        50
    nocrush  
       2018-08-30 10:05:57 +08:00
    语言最初设计 有问题,该割裂就割裂 长痛不如短痛
    nino
        51
    nino  
       2018-08-30 11:01:16 +08:00
    仔细想一想,handle 语法虽然看起来丑,但是有比 try/catch 好的地方
    jon
        52
    jon  
       2019-04-22 10:37:44 +08:00
    go2 赶紧出吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     894 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 20:35 PVG 04:35 LAX 12:35 JFK 15:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86