Go语言 转到bufio.Writer,gzip.Writer并上传到内存中的AWS S3

ryevplcw  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(83)

我正在尝试从内存写入压缩文件并上传到S3。
我正在将一个大的type Data struct数组序列化为一个bufio.Writer,它以逐行的方式写入gzip.Writer

### DATA AND SERIALIZATION

type Data struct {
  field_1 int
  field_2 string
}

func (d *Data) Serialize() []byte {
  return []byte( fmt.Sprintf(`%d;%s\n`, d.field_1, d.field_2) )
}
### CREATE FILE AS COMPRESSED BYTES

var datas []*Data   // assume this is filled

buffer := &bytes.Buffer{}
compressor := gzip.NewWriter(buffer)
writer := bufio.NewWriter(compressor)

for _, data := range datas {
  writer.Write(data.Serialize())
}

writer.Flush()
compressor.Close()
### UPLOAD COMPRESSED FILE TO S3

key := "file.gz"
payload := bytes.NewReader(buffer.Bytes())

upload := &s3.PutObjectInput{
  Body:   payload,
  Bucket: aws.String(bucket),
  Key:    aws.String(key),
}

这个工作,似乎很快,有点效率。
然而,结果文件,虽然在Linux下被认为是一个文本文件,但不荣誉通过\n添加的换行符。不确定这是否是操作系统特定的问题,通过某种方式定义文件类型的问题(例如使用以file.txt.gzfile.csv.gz结尾的文件格式,或通过添加特定的头字节),或者我首先创建这些文件的方式有问题。
在内存中创建一个完全限定的文件类型[]byte(或一般在io.ReadSeeker接口中)上传到S3的正确方法是什么,* 最好是 * 以逐行的方式?

更新:

我能够通过将字符串 Package 在对fmt.Sprintln的调用中来解决这个问题:

func (d *Data) Serialize() []byte {
  return []byte( fmt.Sprintln(fmt.Sprintf(`%d;%s`, d.field_1, d.field_2) )
}


当查看fmt.Sprintln的实现时,它附加了\n符文-一定有我不知道的细微差异。

laik7k3q

laik7k3q1#

更换

`%d;%s\n`

字符串

"%d;%s\n"

**%d;%s\n**是原始字符串文字。在原始字符串中,反斜杠没有特殊的含义。请参见语言规范中的字符串文字:

原始字符串字面量是反引号之间的字符序列,如foo。在引号内,除了反引号外,任何字符都可以出现。原始字符串文字的值是由引号之间的未解释(隐式UTF-8编码)字符组成的字符串;特别地,反斜杠没有特殊含义,并且字符串可以包含换行符。

相关问题