You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Go的bufio.Writer、gzip.Writer内存压缩上传S3的换行问题

问题:Go内存生成压缩文件上传S3后换行符不被Linux识别

原实现代码

数据结构与序列化

type Data struct {
  field_1 int
  field_2 string
}

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

内存生成压缩文件

var datas []*Data   // 假设已填充数据

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

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

writer.Flush()
compressor.Close()

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的正确方式。

解决方法(更新)

改用fmt.Sprintln包裹字符串后问题解决,修改后的序列化方法如下:

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

查看fmt.Sprintln的实现可知它会追加\n字符,推测手动添加的换行符和该方法的实现存在细微差异。


内容的提问来源于stack exchange,提问作者t.ry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:10:11