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 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 目运算符,所以问号应该也是可以使用的。 |
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 10
我一直拒绝 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 4
公司在用 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 2018-08-29 13:30:49 +08:00
感觉这样处理错误还不是很爽
|
21
duanquanyong 2018-08-29 13:44:05 +08:00 2
其实如果觉得 rust 好,如果什么都要跟 rust 一样,为什么不直接用 rust 呢。。。。。。
|
22
duanquanyong 2018-08-29 13:51:16 +08:00 2
很多人吐槽错误处理机制,我倒是觉得这种挺好的,这种错误处理方式虽然看起来丑,其实跟 defer 和 panic 的处理方式是一样的,同时能更好地兼容以前的代码,如果用 try...catch 那基本 go1 那跟以前的代码没办法兼容,到时候 go1 的库 go2 用不了,才会真正割裂吧
|
23
YingJie 2018-08-29 13:51:51 +08:00 via Android 3
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 1
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 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. |
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 编译进去就已经很蛋疼了,还要帮你兜底异常? |
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 赶紧出吧
|