
https://go.googlesource.com/proposal/+/master/design/go2draft.md
主要涉及社区呼声最高的痛点:泛型,错误处理。 但是习惯了 Java,看这个语法感觉有点奇怪...
// 使用现在的错误处理方式 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 } // 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 } 1 wenzhoou 2018-08-29 10:54:29 +08:00 via Android 以后代码每一行都要加一个 check 罗。 |
2 zhs227 2018-08-29 11:00:28 +08:00 ``` 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 目运算符,所以问号应该也是可以使用的。 |
3 feiyuanqiu OP V 站不能编辑主题,也不能 append... 简单搬运一些草案中的新的语法设计 |
4 BBCCBB 2018-08-29 11:14:32 +08:00 丑拒. |
5 zn 2018-08-29 11:32:59 +08:00 我一直拒绝 Go 的原因就是语法太 tmd 丑了,越写越想吐槽,越写越难受。 |
6 XIVN1987 2018-08-29 11:35:30 +08:00 感觉这错误处理还不如 try...cache/except 好看,,有点儿丑,, |
7 loongwang 2018-08-29 11:39:05 +08:00 via Android 有点难受 |
8 bobuick 2018-08-29 11:40:02 +08:00 真 jb 丑。虽然我用了很多 go。 error 处理要么就粗暴搞成跟人家 java 一样的, 要么就学 rust 那类学院点。 三元语法没有,也叫草案。 |
9 MeteorCat 2018-08-29 11:43:44 +08:00 说实话真的不如`try...cache/except`好看 |
10 PureWhiteWu 2018-08-29 11:47:39 +08:00 |
11 8023 2018-08-29 11:48:36 +08:00 via Android 先把函数参数默认值加上再说别的... |
12 MeteorCat 2018-08-29 11:48:52 +08:00 @PureWhiteWu 完了,复制黏贴丢脸了 |
13 anying 2018-08-29 11:49:28 +08:00 真。。。丑拒 |
15 KevinAce 2018-08-29 12:54:07 +08:00 错误处理和没改一样 |
16 sampeng 2018-08-29 12:55:03 +08:00 真心需要 rust 的那个宏啊。。好用到爆炸啊。。。 go 没有宏多写多少代码啊。。。 |
17 3d3ec7a 2018-08-29 13:15:10 +08:00 公司在用 go. 这玩意儿各种语意不一致, 自相矛盾. 工程师拍脑门想出来的东西不靠谱. 还是要学术界的人设计才行. |
18 dodo2012 2018-08-29 13:21:35 +08:00 语法真的是,,怎么说,虽然觉得 rust 语法真难学,但这个就,,简单是简单,但是太丑了吧 |
19 prolic 2018-08-29 13:26:13 +08:00 via Android 丑拒,要改成这样我有概率会转化成 go1 死忠了 |
20 michaelcheng /div> 2018-08-29 13:30:49 +08:00 感觉这样处理错误还不是很爽 |
21 duanquanyong 2018-08-29 13:44:05 +08:00 其实如果觉得 rust 好,如果什么都要跟 rust 一样,为什么不直接用 rust 呢。。。。。。 |
22 duanquanyong 2018-08-29 13:51:16 +08:00 很多人吐槽错误处理机制,我倒是觉得这种挺好的,这种错误处理方式虽然看起来丑,其实跟 defer 和 panic 的处理方式是一样的,同时能更好地兼容以前的代码,如果用 try...catch 那基本 go1 那跟以前的代码没办法兼容,到时候 go1 的库 go2 用不了,才会真正割裂吧 |
23 YingJie 2018-08-29 13:51:51 +08:00 via Android golang 的语法真的受不了,非要标新立异,越写越难受,比这更难受的是一部分 go 吹,无脑崇拜。 |
24 merin96 2018-08-29 13:55:05 +08:00 这他妈还不如不改 |
25 reus 2018-08-29 13:58:46 +08:00 v2ex 里的无脑黑都来了,帖子里充满了快活的气氛 |
26 natscat 2018-08-29 14:11:03 +08:00 慢慢就习惯了 |
27 PythonAnswer 2018-08-29 14:13:16 +08:00 via iPhone check 切克闹 煎饼 go 子来一套 |
28 vincenteof 2018-08-29 14:23:10 +08:00 发表一点主观的看法,这语法是我所有学过的语言里最丑的 |
29 dhssingle 2018-08-29 14:32:19 +08:00 每一行都要 check ?蛋疼 |
30 specita 2018-08-29 14:40:20 +08:00 感觉错误处理那里并没有减少多少代码量。。 |
31 ChristopherWu 2018-08-29 14:40:49 +08:00 曾经的 golang 『粉』,现在觉得 golang 真鸡儿丑。 设计的也不优雅,改了 handle error,想方便一些是好事-_- 还是觉得有点丑.. |
32 Hellert 2018-08-29 14:44:42 +08:00 这个错误处理方式违反直觉,正常思维先发生操作,后处理错误,这个设计是把错误处理放到代码最前面了。 泛型语法可以接受,但为什么不直接用<>而用 type 关键字,尖括号更简单点吧。 |
33 fatedier 2018-08-29 15:11:57 +08:00 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. |
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 编译进去就已经很蛋疼了,还要帮你兜底异常? |
35 darluc 2018-08-29 15:51:35 +08:00 毕竟只是个 draft,这些痛点如果能改好,觉得很不错! |
36 asuraa 2018-08-29 15:53:10 +08:00 真丑 |
37 haozes 2018-08-29 15:58:40 +08:00 这错误处理什么鬼,先写异常处理,再 check,什么直觉。。。 |
38 liuxey 2018-08-29 16:15:52 +08:00 可以,这很 Go,一眼看上去,这一堆啥啊! 写几个 handle,一个个 check, 最后可能还要 defer , 中间穿插着 return,迷宫呢这是 |
39 XIVN1987 2018-08-29 17:14:45 +08:00 看到大家都说丑我就放心了,,我的审美没啥问题(*^^*) |
40 yuekcc 2018-08-29 19:48:14 +08:00 没有人吐嘈泛型的语法吗,为嘛这个另类。 |
41 songtianyi 2018-08-29 20:15:04 +08:00 @yuekcc 因为 Go 是 structural subtyping https://github.com/songtianyi/songtianyi.github.io/blob/master/mds/techniques/go2-design-draft-introduction.md |
42 owenliang 2018-08-29 20:28:48 +08:00 via Android 这个语法是有点。。。 哪个家伙想出来的 |
43 luozic 2018-08-29 20:50:30 +08:00 via iPhone 为啥不学 python 的 meta 或者 C#的模式匹配? 就是 C++古老的模版也比这好看吧 |
44 qianlifeng 2018-08-29 23:21:35 +08:00 Error Handling 是真丑,没了一堆 if err != nil 引入了一堆的 check handler,关键是 handler 还现在前面,读代码的时候先看到错误处理,一脸懵逼,然后再往下看才知道原始是处理这个。。。 |
45 kidlj 2018-08-30 00:01:11 +08:00 via iPhone Go 的错误处理,丑但是正确。 |
46 georgetso 2018-08-30 00:13:13 +08:00 的确丑, 没法洗地 |
47 PythonAnswer 2018-08-30 00:44:52 +08:00 防御性编程,上来先想到出错的地方,所谓御敌千里之外是也。 不过我一直不喜欢写 go,是因为他非要用 tab。 |
48 aa6563679 2018-08-30 08:40:29 +08:00 via iPhone go 语言是 c 的改进版,这样想就不觉得丑了 |
49 gowk 2018-08-30 09:52:00 +08:00 为什么我觉得很美呢。。哦对了,我是无脑 Go 吹 |
50 nocrush 2018-08-30 10:05:57 +08:00 语言最初设计 有问题,该割裂就割裂 长痛不如短痛 |
51 nino 2018-08-30 11:01:16 +08:00 仔细想一想,handle 语法虽然看起来丑,但是有比 try/catch 好的地方 |
52 jon 2019-04-22 10:37:44 +08:00 go2 赶紧出吧 |