亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何模擬調用 io.Copy 的函數

如何模擬調用 io.Copy 的函數

Go
明月笑刀無情 2022-12-26 10:20:07
試圖模擬以下功能。它基本上從 S3 ( io.ReadCloser) 中獲取一個對象并將其寫入一個文件,該文件執行os.Open()時間較早 ( 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}我想我已經很接近了,但目前我的測試掛起并且永遠不會出錯/成功......我也意識到我可以os.Stdout到達目的地,但仍然遇到了同樣的問題。里面發生了一些事情io.Copy。我想這是因為我試圖將空數據復制為空?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貢獻1797條經驗 獲得超6個贊

這是因為io.Copy直到 EOF 或錯誤才返回。

將副本從 src 復制到 dst,直到在 src 上到達 EOF 或發生錯誤。它返回復制的字節數和復制時遇到的第一個錯誤(如果有)。

成功的 Copy 返回 err == nil,而不是 err == EOF。因為 Copy 被定義為從 src 讀取直到 EOF,所以它不會將 Read 的 EOF 視為要報告的錯誤。

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

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

這是因為 Read 被重復調用,直到沒有更多內容可讀 (EOF)。

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


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號