Как говорит ошибка:
не может использовать тело (тип [] байт) в качестве типа io.Reader в аргументе csv.NewReader: [] байт не реализует io.Reader (отсутствует чтениеметод)
, поскольку вы передаете []byte
, возвращенный из ответа на csv.NewReader
Требуется реализовать io.Reader
для тела, чтобы передать его в качестве аргумента csv.NewReader
.Так как он принимает io.Reader
в качестве аргумента.Попробуйте изменить свой код следующим образом:
reader := csv.NewReader(bytes.NewBuffer(body))
record, err := reader.ReadAll()
if err != nil {
fmt.Println("Error", err)
}
Также, поскольку aws.GetObject возвращает указатель на GetObjectOutput
struct.
func (c *S3) GetObject(input *GetObjectInput) (*GetObjectOutput, error)
, которая сама реализует Reader
type GetObjectOutput struct {
....
// Object data.
Body io.ReadCloser `type:"blob"`
....
}
, так что вы можете передать возвращенное тело непосредственно в csv.NewReader.
Еще одна вещь, которую вы можете использовать для загрузкиManager
Загрузчик пакета s3manager обеспечивает одновременную загрузку объектов из S3.Загрузчик запишет содержимое объекта S3 с помощью io.WriterAt.После создания экземпляра Downloader вы можете безопасно вызывать Download одновременно из нескольких групп.
func (d Downloader) Download(w io.WriterAt, input *s3.GetObjectInput, options ...func(*Downloader)) (n int64, err error)
Download загружает объект в S3 и записывает полезную нагрузку в w с помощью одновременных запросов GET.
Безопасно вызывать этот метод одновременно через goroutines.
// The session the S3 Downloader will use
sess := session.Must(session.NewSession())
// Create a downloader with the session and default options
downloader := s3manager.NewDownloader(sess)
// Create a file to write the S3 Object contents to.
f, err := os.Create(filename)
if err != nil {
return fmt.Errorf("failed to create file %q, %v", filename, err)
}
// Write the contents of S3 Object to the file
n, err := downloader.Download(f, &s3.GetObjectInput{
Bucket: aws.String(myBucket),
Key: aws.String(myString),
})
if err != nil {
return fmt.Errorf("failed to download file, %v", err)
}