V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Nugine0  ›  全部回复第 5 页 / 共 6 页
回复总数  120
1  2  3  4  5  6  
2020-10-05 10:16:39 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus
我看你是根本不懂 rust 。

read 的返回值是 Result<usize, io::Error>,不能用 ErrorKind 直接匹配,这是我说“错”的原因。

两分支是最原本的写法,用来论证“要么成功要么失败”,进一步论证 go 双元组的设计不好。

你说的四分支是等价版本,把直接跳转改成了 fall through,本质上是按情况处理 union type 的两个可能模式。

我说 14+29=42 不对,21+21=42 是对的。你偏要说 10+10+10+12=42 也是对的,反过来喷我,我也是服了。

变点写法就看不懂了?某一层封装一下,不就能用问号运算符了?这么简单的事实,还用我专门说?

标准库用问号运算符,把 Interrupt 暴露出去,一搜一大把,你难道也要说不对不对别人不是这么写的?

https://doc.rust-lang.org/src/std/io/buffered.rs.html#274

回到 go 上

https://dave.cheney.net/tag/panic

"When you panic in Go, you’re freaking out, it’s not someone elses problem, it’s game over man."

把 panic 当 exception 用,就是违反语言机制设计意图的,就是一种滥用。

再怎么 panic/recover,作者也不敢越过库的边界,无法代替 err 。

我说这是混淆的写法,有何问题?
2020-10-04 23:58:55 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus

有问题的程序,会直接 panic,而不需要写代码掩盖代码本身的问题。

用 panic / recover 处理错误,正是掩盖了代码本身的问题。

这不是双标,那什么是双标?
2020-10-04 23:52:39 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 语法糖和函数一样?不然为什么有 check 语法的提案?

学到个教训,不说清楚就会引来死缠烂打。我原来的意思就是编译错误,因为 io Error 和 io ErrorKind 不同。

前提都是错的,那什么结论都有可能。你非要往其他方向理解,那你说的都对。
2020-10-04 23:23:53 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 用 panic/recover 来处理 error 就是一种混淆的做法,不然为什么不设计成 try/catch ?

当然,你完全可以不理会我的看法,毕竟我“水平不高”。
2020-10-04 23:09:52 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus

你对我那句话的理解,明显有严重偏差。

“错”是指编译不过,“真正”的写法是指能编译通过的写法。非得说成这样才明白?

你说过什么,想表达什么意思,清清楚楚。

你说 panic 是代码本身的问题。

但 error 显然是运行时的问题,二者不能混为一谈。这不是我一个人的看法,网上文章多了去了。

能用 panic/recover,不代表 if err != nil 就是好的。别人说事物 A 不好,你说可以用事物 B,并反过来指责别人,真是荒谬。

我倒是很佩服能莫名其妙发火的人,别误会,说的不是你。
2020-10-04 22:14:09 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 火气这么大,不如去写点代码冷静一下,然后再来教别人怎么错误处理。
2020-10-04 22:02:16 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 绝了,我说“编译不过就是错”,没说必须要用两个分支,真能脑补。
我也没说 rust 更优雅,我说的是 go io.Reader 是没有 union type 造成的设计失误。
2020-10-04 21:59:09 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 写函数替代 if err != nil 不能改变控制流,用 panic/recover 又与你之前的言论矛盾,我很好奇你是怎么写的。

“就算返回的是指针,且函数有问题,那后面如果遇到解指针,那就会直接 panic,表明程序需要改,是不需要写代码做检查的。”
2020-10-04 21:39:16 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus
编译不过就是错,不知道你口中的“错”还能是什么?
你认为我有偏见,你这说法本身就是偏见。搁这套娃呢,火气真大。

我讲了设计失误,你上来就是“双标”,谁有偏见?
2020-10-04 21:31:49 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 再换成 C,没人会说 C 难吧。
看看 C 有什么,基于错误码的错误处理,预处理器。
C 也要挨个判断返回值,但人家有宏。
go 稍微给点语法糖都不会被喷 if err != nil,但还是坚持,估计以后也会一直被喷。

Linux 内核是用 C 写的,是个人都能轻松学会 C,能读 C 代码不代表能懂。
go 所谓的简单,真的能让人“懂”大型项目?光阅读有什么用?我看未必,把代码复杂度和语法复杂度混淆起来而已。

go module 就凭空增加了一项学习成本,将要出来的泛型也是。

减掉的复杂度最终都会加回来,成为内卷的工具,等着瞧。
2020-10-04 21:04:55 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus
前面人给的 rust 代码是错的,你却拿这个举例,算不算被钓鱼?
我在谈事实,你却直接攻击别人“双标”。看来这就是某些人的素质,真是“高”啊。

1. rust 的真正写法是 read(&mut buf)?,或者用两个分支的 match 分别处理成功和失败。成功分支中有可能是已读完的情况。
go 的 if 是 fall though 的,需要理解的代码范围更多。
你以为我要说 rust 更优雅?错了。
我要说的一直是:go 自称简单,但实际上并不简单。
一个自称简单的语言和一个公认难学的语言比心智负担,说出来丢不丢人?

2. 我定义的正常函数就是要么成功要么失败,语义不同就是增加负担,对人不友好就是反人类,还要怎么解释?
io 本来就有固有的复杂度,却在这里节省一次调用,简直莫名其妙。
我要不要再去研究一下“节省”和“不节省”的等价性?我认为这就是设计失误。你开心就好。

3. rust 的 lint 的确是语言机制的一部分,具体表现为 rustc 内置 lint 和 clippy 扩展 lint 。我还说 doc 和 tests 也是 rust 语言机制的一部分,请问有没有意见?

再强调一下我的论点:go 自称简单,但实际上并不简单。

能看成捧一踩一的,你开心就好。
2020-10-04 12:02:27 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 再说 rust 。
non_exhaustive 归 lint 管,上游新增了字段会被 lint 查出来,可以自动化。
<https://rust-lang.github.io/rust-clippy/master/index.html#wildcard_enum_match_arm>
讲真的,不会有编程语言连这种程度的 lint 都做不到吧。

有异步运行时能把同步 IO 转异步 IO,依赖的就是非阻塞和 WouldBlock 。
Rust 异步运行时依靠社区,没 go 那么统一,某种程度上是弱点,但也给出了自由空间。
2020-10-04 11:20:42 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
@reus 根据你的介绍,这个 io.Reader 显然是没有 union type 带来的设计失误。

按正常人的思维,调用一个接口要么成功,要么失败,应该用 union type 。但 (42, io.EOF) 算什么?叠加态?

你可以列很多理由说明这个设计合理,但改变不了它反人类的事实,它的语义和正常函数是不同的。这就是额外的心智负担,说好的大道至简呢?

go 阅读起来也不是那么容易。检查完 err 不检查空指针,直接挂了。调用栈追下去,一个 interface{}拍脸上,得,全动态了。

go 用看似简单的语法给人快速入门的错觉,真以为什么人都能看懂大项目?真以为换条赛道就能马上超车?路上的坑一个也逃不了,全要挨个踩过去。
2020-10-03 16:32:08 +08:00
回复了 kidlj 创建的主题 Go 编程语言 要学 Go 的赶紧上车
Rust 才应该是真正的云原生语言,没开玩笑。
正反论据都很多,就不列举了。
2020-09-13 22:46:56 +08:00
回复了 charlie21 创建的主题 奇思妙想 如何远离工业文明?
在城市里,你接触的一切都是工业文明的成果。水电,网络,卫生,交通,衣服,食物,等等,都是工业化社会才能提供的基础服务。

回到刀耕火种的时代,光是生存就要竭尽全力,哪有时间想这些。

只有在生产力爆表的未来,才可能实现理想中的田园生活。
2020-09-12 17:03:30 +08:00
回复了 dafsic 创建的主题 Go 编程语言 看到好多人吐槽 golang 的错误处理,但我用的很爽啊
@dafsic 这和编程语言有什么关系?
2020-09-11 22:33:23 +08:00
回复了 dafsic 创建的主题 Go 编程语言 看到好多人吐槽 golang 的错误处理,但我用的很爽啊
@dafsic ¿
2020-09-11 21:00:37 +08:00
回复了 dafsic 创建的主题 Go 编程语言 看到好多人吐槽 golang 的错误处理,但我用的很爽啊
rust 用问号运算符和异常差不多爽,要严格处理错误可以当场判断,能确保错误被处理,上下都涵盖了。
C 还能用宏,go 怎么偷懒?没法偷懒不就是反人类吗?
所有语言的异步 IO 都需要操作系统的非阻塞支持,比如 epoll 。
应用注册 IO,当 IO 完成后,系统会通知应用处理对应事件,这样一个线程就能同时进行多个 IO 操作,不用被阻塞调用卡住。

拿 js 举例,无栈异步语法分为回调、Promise 、async/await 三种,第一种是回调地狱,第二种链式调用开火车,第三种用同步格式写异步,最人性化。

再拿 go 举例,有栈异步语法与同步一致,调度器会在进行 IO 时自动把协程切走。py 在没有 async 语法时用的是 gevent 有栈协程,把同步操作自动换成异步,无需修改代码。

js 本身就是事件循环,无栈协程是加糖解决回调地狱。

py 有两种协程,gevent 的有栈协程,asyncio 的无栈协程,都是为了提高 IO 效率。

go 是有栈协程,m:n 调度,多个线程上可以运行多个协程,卡住时其他线程还会偷走多余的任务。本来一个线程只能进行一个 IO 操作,现在可以同时进行多个,提高 IO 效率。

c++20 的是无栈协程,但可能有隐式分配。

Rust 的是无栈协程,没有隐式分配,调度器要自己选择第三方库,基本上都有工作窃取算法。其中的无栈协程可以不用分配直接放栈上执行,也可以交给调度器作为顶层 future 执行。而且 Rust 没有 GC,实时性可以有保证。

个人认为,在各种语言中,Rust 的无栈协程是最轻量的。
1  2  3  4  5  6  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3190 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 21ms · UTC 12:38 · PVG 20:38 · LAX 04:38 · JFK 07:38
Developed with CodeLauncher
♥ Do have faith in what you're doing.