我正在try 从内存中写入压缩文件并上传到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添加了not honor the line breaks.不确定这是操作系统特定的问题,还是通过某种方式定义文件类型的问题(例如,使用以file.txt.gzfile.csv.gz结尾的文件格式,或者通过添加特定的头字节),或者是我最初创建这些文件的方式的问题.

将完全限定的内存中文件类型创建为[]byte(或通常在io.ReadSeeker接口内)以逐行方式上载到S3、preferably的正确方式是什么?


Update:

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

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

当看fmt.Sprintln的实现时,它附加了\n符文--肯定有我没有意识到的细微差别.

推荐答案

替换

`%d;%s\n`

使用

"%d;%s\n"

`%d;%s\n`是一个原始字符串文字.在原始字符串文字中,反斜杠没有特殊意义.请参阅语言规范中的String literals:

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

Go相关问答推荐

无法在Macos上使用Azure Speech golang SDK

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

编辑时保留YAML文件中的单引号

允许在 struct 中使用复合作为函数参数

戈姆:如何将一对一联系起来?

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

无法读取postman 中的表单数据

使用Dockertest进行Golang SQL单元测试的基本设置

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

判断不同 go map 类型中的重复键

为什么不同的 Wireguard 私钥会产生相同的公钥?

如何使用带有方法的字符串枚举作为通用参数?

CORS grpc 网关 GoLang

如何使用 math/big 对 bigInt 进行取模?

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

httprouterhttp.HandlerFunc() 是如何工作的?

Unescape 在 rss 中两次逃脱了标题

golang 如何从字符串中查找表情符号?

为什么 Go 不允许将一个泛型分配给另一个泛型?