golang 的 io.Copy 那一堆东西不符合一般的函数约定吧? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lysShub
V2EX    Go 编程语言
<1>golang 的 io.Copy 那一堆东西不符合一般的函数约定吧?
  •  
  •   lysShub 143 天前 2211 次点击
    这是一个创建于 143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    可以同时返回 n>0 并且 err!=nil , 是历史遗留吗?

    导致这段代码写得挺丑的 https://github.com/golang/go/blob/master/src/io/io.go#L431

    14 条回复    2025-06-05 18:05:20 +08:00
    AEnjoyable
        1
    AEnjoyable  
       143 天前 via Android
    这没有什么问题。
    返回值要返回啥都是开发者自己确定的。。。至于为什么不改,主要是怕谁引用了这逻辑,改了做不到向下兼容。
    对了,你的主题发错分区了。
    pkoukk
        2
    pkoukk  
       143 天前
    我记忆里,go 似乎没有说过,不允许在 err!=nil 的时候返回有意义的值吧?
    pkoukk
        3
    pkoukk  
       143 天前
    @pkoukk 他们甚至直接在文档里告诉你,这么做是语言的特色,是允许的。
    https://go.dev/doc/effective_go#functions
    Trim21
        4
    Trim21  
       143 天前
    这个例子里没啥问题吧,copy 又不是原子操作,如果是 copy 了 n 个字节中途出错了呢
    jworg
        5
    jworg  
       143 天前
    我觉得这样做挺合理的啊,比如写磁盘,磁盘满了没能全写下去,得有一个错误,然后很难回退得有一个值标明干了多少事情。
    sujin190
        6
    sujin190  
       143 天前
    这两个不同语义吧,谁说 n>0 就不会有 err 的
    jworg
        7
    jworg  
       143 天前
    比如 rust 的等同接口

    pub fn copy<R: ?Sized, W: ?Sized>(reader: &mut R, writer: &mut W) -> Result<u64>
    where
    R: Read,
    W: Write,

    如果出错了,error 里取不到成功干了多少事,这时你该怎么办。
    mainjzb
        8
    mainjzb  
       143 天前
    这就是同时返回 有效值和 error 的唯一优点了。 (不然学 rust 合并成 result 了

    设想以下场景:
    传输 tcp 2G 数据,传到一半的时候异常断开连接了。
    下次启动可以断点续传。
    Leviathann
        9
    Leviathann  
       143 天前
    @mainjzb 代数数据类型 可以任意组合 嵌套一下就能表达
    Nitroethane
        10
    Nitroethane  
       143 天前
    这符合惯例吧,看看 Linux 的 `read(2)` 和 `write(2)` 就明白了
    guanzhangzhang
        11
    guanzhangzhang  
       142 天前
    因为具体实现接口的存流的不一定一次能处理完数据,然后每次处理都可能出错
    mizuki9
        12
    mizuki9  
       142 天前
    我觉得设计没什么问题,但也没什么用处,既然出错了,写了一半的长度 n 应该没什么用,最多展示一下,搞续传什么的不现实
    lysShub
        13
    lysShub  
    OP
       141 天前
    @mainjzb 可以把 size 携带在 error 里面
    xfriday
        14
    xfriday  
       126 天前
    @jworg -> Result<usize, usize>
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3766 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 00:52 PVG 08:52 LAX 17:52 JFK 20:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86