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 · 8552 次点击
    这是一个创建于 2277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       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 和 crash 变成人 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   ·   实用小工具   ·   4413 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:05 · PVG 18:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.