gpt4 book ai didi

golang zlib 阅读器输出未被复制到标准输出

转载 作者:IT王子 更新时间:2023-10-29 01:51:16 26 4
gpt4 key购买 nike

我修改了 zlib 包的官方文档示例,以使用打开的文件而不是一组硬编码字节(代码如下)。

代码读取源文本文件的内容并使用 zlib 包对其进行压缩。然后我尝试读回压缩文件并将其解压缩的内容打印到标准输出中。

代码没有错误,但也没有按照我的预期进行;这是将解压后的文件内容显示到stdout中。

Also: is there another way of displaying this information, rather than using io.Copy?

    package main

import (
"compress/zlib"
"io"
"log"
"os"
)

func main() {
var err error

// This defends against an error preventing `defer` from being called
// As log.Fatal otherwise calls `os.Exit`
defer func() {
if err != nil {
log.Fatalln("\nDeferred log: \n", err)
}
}()

src, err := os.Open("source.txt")
if err != nil {
return
}
defer src.Close()

dest, err := os.Create("new.txt")
if err != nil {
return
}
defer dest.Close()

zdest := zlib.NewWriter(dest)
defer zdest.Close()

if _, err := io.Copy(zdest, src); err != nil {
return
}

n, err := os.Open("new.txt")
if err != nil {
return
}

r, err := zlib.NewReader(n)
if err != nil {
return
}
defer r.Close()
io.Copy(os.Stdout, r)

err = os.Remove("new.txt")
if err != nil {
return
}
}

最佳答案

您的 defer 函数不执行任何操作,因为您在每次新赋值时都隐藏了 err 变量。如果你想让 defer 运行,从一个单独的函数返回,并在 return 语句之后调用 log.Fatal

至于为什么您没有看到任何输出,那是因为您推迟了所有 Close 调用。 zlib.Writer 直到函数退出后才会刷新,目标文件也不会刷新。在需要的地方显式调用 Close()

zdest := zlib.NewWriter(dest)

if _, err := io.Copy(zdest, src); err != nil {
log.Fatal(err)
}
zdest.Close()
dest.Close()

关于golang zlib 阅读器输出未被复制到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com