Golang:将xml转换为gzip时出现问题

Golang:将xml转换为gzip时出现问题,xml,go,gzip,data-conversion,Xml,Go,Gzip,Data Conversion,我正在开发一个程序,使用golang将xml文件压缩到gzip 但是程序无法生成文件,但是当我尝试将.txt文件转换为gzip时,它确实生成了输出。 这是我的节目:- 主程序包 进口( “字节” “压缩/gzip” “fmt” “io” “日志” “操作系统” ) 类型Notes结构{ To字符串`xml:“To”` From字符串`xml:“From”` 标题字符串`xml:“标题”` Body字符串`xml:“Body”` } func main(){ var buf字节。缓冲区 zw:=g

我正在开发一个程序,使用golang将xml文件压缩到gzip

但是程序无法生成文件,但是当我尝试将.txt文件转换为gzip时,它确实生成了输出。 这是我的节目:-

主程序包
进口(
“字节”
“压缩/gzip”
“fmt”
“io”
“日志”
“操作系统”
)
类型Notes结构{
To字符串`xml:“To”`
From字符串`xml:“From”`
标题字符串`xml:“标题”`
Body字符串`xml:“Body”`
}
func main(){
var buf字节。缓冲区
zw:=gzip.NewWriter(&buf)
//设置标题字段是可选的。
zw.Name=“new.xml”
_,err:=zw.Write([]字节(“压缩”))
如果错误!=零{
log.Fatal(错误)
}
如果错误:=zw.Close();错误!=nil{
log.Fatal(错误)
}
zr,err:=gzip.NewReader(&buf)
如果错误!=零{
log.Fatal(错误)
}
fmt.Printf(“名称:%s”,zr.Name)
如果3;,err:=io.Copy(os.Stdout,zr);err!=nil{
log.Fatal(错误)
}
如果错误:=zr.Close();错误!=nil{
log.Fatal(错误)
}
}
如何生成所需的.gz文件。

现在,
zw.Write()
调用将把(压缩的)数据写入
buff
。由于您希望将其写入一个文件,因此您应该创建一个这样做的东西

最简单的方法是使用
os.Create()
。此函数返回一个
*os.File
,该文件实现了
io.Writer

生成的代码如下所示:

主程序包
进口(
“压缩/gzip”
“日志”
“操作系统”
)
func main(){
//这将创建一个文件并返回io.Writer的实现
fileWriter,err:=os.Create(“./file.gz”)
如果错误!=零{
log.Println(错误)
返回
}
延迟fileWriter.Close()
//使用io.Writer创建gzip.Writer。
zw:=gzip.NewWriter(fileWriter)
延迟zw.Close()
//设置标题字段是可选的。
zw.Name=“new.xml”
//调用gzip.Writer.Write时,它会将数据传递给我们在第17行传递的io.Writer的Write函数。
//如果写入实际文件时出错,将返回该文件。
_,err=zw.Write([]字节(“压缩”))
如果错误!=零{
log.Println(错误)
返回
}
}
这种编写编写器的方式使更改工作方式变得非常容易,而无需更改太多代码。您可以更进一步地进行此组合,因为
*xml.Encoder
也是
io.Writer
的一个实现,它将另一个
io.Writer
作为参数,就像
*gzip.Writer
一样。因此,要实际生成XML并将其写入文件,并在此过程中对其进行gzip处理,只需执行以下操作:

主程序包
进口(
“压缩/gzip”
“编码/xml”
“日志”
“操作系统”
)
类型Notes结构{
To字符串`xml:“To”`
From字符串`xml:“From”`
标题字符串`xml:“标题”`
Body字符串`xml:“Body”`
}
func main(){
//这将创建一个文件并返回*os.file,这是io.Writer的一个实现
fileWriter,err:=os.Create(“./notes.gz”)
如果错误!=零{
log.Println(错误)
返回
}
延迟fileWriter.Close()
//使用io.Writer创建gzip.Writer。
zw:=gzip.NewWriter(fileWriter)
延迟zw.Close()
//设置标题字段是可选的。
zw.Name=“notes.xml”
注释:=[]注释{
{
致:“爱丽丝”,
来自:“鲍勃”,
标题:“你好”,
身体:“嗨,爱丽丝,你好吗?”,
},
{
致:“鲍勃”,
来自:“爱丽丝”,
标题:“Re:Hi”,
身体:“嗨,鲍勃!我很好,thnx。”,
},
}
//使用gzip.Writer(实现io.Writer)创建xml.Encoder。
xmlWriter:=xml.NewEncoder(zw)
//现在,我们有了一个xml.Encoder,它可以写入一个gzip.Writer,它可以写入io.File。
//调用Encode()将生成XML,并将其传递给gzip.Writer.Write,后者将其传递给os.File.Write。
err=xmlWriter.Encode(注释)
如果错误!=零{
log.Println(错误)
返回
}
}

这种创作作家(以及读者)的方式非常强大。您可以在许多地方找到它,使“分层”写入程序非常容易。

缓冲区变量buf中有所有压缩字节,它的类型为[]字节,您现在要做的就是找到“如何将数组字节写入磁盘golang”,也许这个示例:可以帮助您