第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何模擬調(diào)用 io.Copy 的函數(shù)

如何模擬調(diào)用 io.Copy 的函數(shù)

Go
明月笑刀無情 2022-12-26 10:20:07
試圖模擬以下功能。它基本上從 S3 ( io.ReadCloser) 中獲取一個(gè)對(duì)象并將其寫入一個(gè)文件,該文件執(zhí)行os.Open()時(shí)間較早 ( io.WriteCloser)。package mainimport (    "io"    log "github.com/sirupsen/logrus")func writeFile(destination io.WriteCloser, source io.ReadCloser) error {    defer destination.Close()    defer source.Close()    _, err := io.Copy(destination, source)    if err != nil {        log.WithFields(log.Fields{"desc": "unable to copy contents from s3 to blahblah"}).Error(err)        return err    }    return nil}我想我已經(jīng)很接近了,但目前我的測(cè)試掛起并且永遠(yuǎn)不會(huì)出錯(cuò)/成功......我也意識(shí)到我可以os.Stdout到達(dá)目的地,但仍然遇到了同樣的問題。里面發(fā)生了一些事情io.Copy。我想這是因?yàn)槲以噲D將空數(shù)據(jù)復(fù)制為空?package mainimport (    "errors"    "io"    "reflect"    "testing")type mockReadCloser struct {}func (m mockReadCloser) Read(p []byte) (int, error) { return 0, nil }func (m mockReadCloser) Close() error               { return nil }type mockWriteCloser struct{}func (m mockWriteCloser) Close() error                      { return nil }func (m mockWriteCloser) Write(b []byte) (n int, err error) { return 0, nil }func Test_writeFile(t *testing.T) {    type args struct {        destination io.WriteCloser        source      io.ReadCloser    }    tests := []struct {        name    string        args    args        wantErr bool    }{        {            name: "",            args: args{                destination: &mockWriteCloser{},                source:      &mockReadCloser{},            },            wantErr: false,        },    }    for _, tt := range tests {        t.Run(tt.name, func(t *testing.T) {            if err := writeFile(tt.args.destination, tt.args.source); (err != nil) != tt.wantErr {                t.Errorf("writeFile() error = %v, wantErr %v", err, tt.wantErr)            }        })    }}
查看完整描述

1 回答

?
互換的青春

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

這是因?yàn)?a >io.Copy直到 EOF 或錯(cuò)誤才返回。

將副本從 src 復(fù)制到 dst,直到在 src 上到達(dá) EOF 或發(fā)生錯(cuò)誤。它返回復(fù)制的字節(jié)數(shù)和復(fù)制時(shí)遇到的第一個(gè)錯(cuò)誤(如果有)。

成功的 Copy 返回 err == nil,而不是 err == EOF。因?yàn)?Copy 被定義為從 src 讀取直到 EOF,所以它不會(huì)將 Read 的 EOF 視為要報(bào)告的錯(cuò)誤。

因此,如果您從 返回 EOF mockReadCloser.Read,它就不會(huì)再掛起。

func (m mockReadCloser) Read(p []byte) (int, error) { return 0, io.EOF }

這是因?yàn)?Read 被重復(fù)調(diào)用,直到?jīng)]有更多內(nèi)容可讀 (EOF)。

for {
    nr, er := src.Read(buf)
    ...
}


查看完整回答
反對(duì) 回復(fù) 2022-12-26
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)