可以同时返回 n>0 并且 err!=nil , 是历史遗留吗?
导致这段代码写得挺丑的 https://github.com/golang/go/blob/master/src/io/io.go#L431
![]() |
1
AEnjoyable 106 天前 via Android
这没有什么问题。
返回值要返回啥都是开发者自己确定的。。。至于为什么不改,主要是怕谁引用了这逻辑,改了做不到向下兼容。 对了,你的主题发错分区了。 |
![]() |
2
pkoukk 106 天前
我记忆里,go 似乎没有说过,不允许在 err!=nil 的时候返回有意义的值吧?
|
![]() |
3
pkoukk 106 天前
|
![]() |
4
Trim21 106 天前
这个例子里没啥问题吧,copy 又不是原子操作,如果是 copy 了 n 个字节中途出错了呢
|
5
jworg 106 天前
我觉得这样做挺合理的啊,比如写磁盘,磁盘满了没能全写下去,得有一个错误,然后很难回退得有一个值标明干了多少事情。
|
![]() |
6
sujin190 106 天前
这两个不同语义吧,谁说 n>0 就不会有 err 的
|
7
jworg 106 天前
比如 rust 的等同接口
pub fn copy<R: ?Sized, W: ?Sized>(reader: &mut R, writer: &mut W) -> Result<u64> where R: Read, W: Write, 如果出错了,error 里取不到成功干了多少事,这时你该怎么办。 |
![]() |
8
mainjzb 106 天前
这就是同时返回 有效值和 error 的唯一优点了。 (不然学 rust 合并成 result 了
设想以下场景: 传输 tcp 2G 数据,传到一半的时候异常断开连接了。 下次启动可以断点续传。 |
9
Leviathann 106 天前
@mainjzb 代数数据类型 可以任意组合 嵌套一下就能表达
|
![]() |
10
Nitroethane 106 天前
这符合惯例吧,看看 Linux 的 `read(2)` 和 `write(2)` 就明白了
|
![]() |
11
guanzhangzhang 105 天前
因为具体实现接口的存流的不一定一次能处理完数据,然后每次处理都可能出错
|
12
mizuki9 105 天前
我觉得设计没什么问题,但也没什么用处,既然出错了,写了一半的长度 n 应该没什么用,最多展示一下,搞续传什么的不现实
|