Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang程序在写入完成之前关闭文件_Go_Writer - Fatal编程技术网

Golang程序在写入完成之前关闭文件

Golang程序在写入完成之前关闭文件,go,writer,Go,Writer,我已经为我的云程序实现了一个定制的写接口。 到目前为止,我的问题是,在我将文件复制到写入程序并关闭写入程序后,写入程序仍有一些写入操作要做(通常可能是4次写入,每次写入4096字节)。最后一次写入通常小于4096 这还没有发生,但我知道最后一次写入4096字节的概率是1/4096,并且我的程序不会终止 我将其用于压缩程序,io.EOF并不是有效的,因为每个写块都有一个,同时检查writer是否关闭太早,而还有一些写操作要做 处理这种情况的最佳方法是什么 ***编辑***** 我最终实现了一个更健

我已经为我的云程序实现了一个定制的写接口。 到目前为止,我的问题是,在我将文件复制到写入程序并关闭写入程序后,写入程序仍有一些写入操作要做(通常可能是4次写入,每次写入4096字节)。最后一次写入通常小于4096

这还没有发生,但我知道最后一次写入4096字节的概率是1/4096,并且我的程序不会终止

我将其用于压缩程序,io.EOF并不是有效的,因为每个写块都有一个,同时检查writer是否关闭太早,而还有一些写操作要做

处理这种情况的最佳方法是什么

***编辑*****
我最终实现了一个更健壮的Write()、Flush()和Close()方法。现在,如果我使用defer Close(),一切都很好,但是如果我在最后手动调用Close(),我仍然会遇到同样的问题,因为您可以完全控制编写器,所以可以使用
要在
main
中等待所有goroutines完成。

由于对写入程序具有完全控制权,您可以使用
main
中等待所有goroutine完成。

问题通过实现更健壮的
Close()
函数得到解决。我还使用了
defer Close()
来确保Golang在内部处理所有的Goroutine。

通过实现一个更健壮的
Close()
函数解决了这个问题。我还使用了
defer Close()
来确保Golang在内部处理了所有的goroutine。

我不明白,你怎么不知道你是否已经编写了数据?如果你在每个块上都有EOF,那你就做错了。所以我打开一个文件,复制一些字节到其中,然后关闭它。这部分是有效的。潜在的“作者”通常需要时间才能赶上——我猜是从写块开始的。因此,我得到了一种情况,即文件已关闭,但底层写入程序几乎完成了追赶。普通写入程序会在关闭时阻塞,直到完成所有缓冲写入。我不知道您的底层编写器是什么,但听起来好像工作不正常。我的编写器很简单,只将p字节写入底层缓冲区。如果我的缓冲区达到5MB,我执行操作1,如果没有,我执行操作2。我还需要知道什么时候完成操作1。通常这是我检查它是否关闭的地方。我将研究阻塞。是的,您需要某种通信方式,但写入尚未完成。阻塞关闭方法和/或刷新方法很常见,但您还没有显示导致问题的任何实现,因此很难提出解决方案。我不明白,您怎么不知道您是否已经编写了数据?如果你在每个块上都有EOF,那你就做错了。所以我打开一个文件,复制一些字节到其中,然后关闭它。这部分是有效的。潜在的“作者”通常需要时间才能赶上——我猜是从写块开始的。因此,我得到了一种情况,即文件已关闭,但底层写入程序几乎完成了追赶。普通写入程序会在关闭时阻塞,直到完成所有缓冲写入。我不知道您的底层编写器是什么,但听起来好像工作不正常。我的编写器很简单,只将p字节写入底层缓冲区。如果我的缓冲区达到5MB,我执行操作1,如果没有,我执行操作2。我还需要知道什么时候完成操作1。通常这是我检查它是否关闭的地方。我将研究阻塞。是的,您需要某种通信方式,但写入尚未完成。阻塞关闭方法和/或刷新方法很常见,但您还没有显示导致问题的任何实现,因此很难提出解决方案。