我正在尝试从内存写入压缩文件并上传到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.gz
或file.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
符文-一定有我不知道的细微差异。
1条答案
按热度按时间laik7k3q1#
更换
字符串
与
型
**
%d;%s\n
**是原始字符串文字。在原始字符串中,反斜杠没有特殊的含义。请参见语言规范中的字符串文字:原始字符串字面量是反引号之间的字符序列,如
foo
。在引号内,除了反引号外,任何字符都可以出现。原始字符串文字的值是由引号之间的未解释(隐式UTF-8编码)字符组成的字符串;特别地,反斜杠没有特殊含义,并且字符串可以包含换行符。