試圖模擬以下功能。它基本上從 S3 ( io.ReadCloser) 中獲取一個物件并將其寫入之前執行os.Open()d 的檔案 ( io.WriteCloser)。
package main
import (
"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 main
import (
"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)
}
})
}
}
uj5u.com熱心網友回復:
這是因為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)
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493487.html
標籤:去
