試圖模擬以下功能。它基本上從 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)
...
}- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報(bào)
0/150
提交
取消
