Go os.Truncate()不重置文件光标

Go os.Truncate()不重置文件光标,go,Go,我最近尝试使用参数为0的os.Truncate,在将修改后的版本重新写入文件之前清除文件内容(我知道这是一种非常不安全的做法,但文件内容对我来说并不重要) 让我震惊的是Truncate并没有重置文件的光标,所以当我写回文件时,我得到了一个前缀为一堆空字节(对应于前面内容的大小)的文件,除非我事先使用了file.Seek(0,0) 所以我的问题是:这是语言的一个bug,是在函数实现过程中被遗忘的东西,还是故意的,出于某种神秘的原因,这是一种期望的行为?那个神秘的原因可能是什么 我使用的是go版本g

我最近尝试使用参数为0的
os.Truncate
,在将修改后的版本重新写入文件之前清除文件内容(我知道这是一种非常不安全的做法,但文件内容对我来说并不重要)

让我震惊的是Truncate并没有重置文件的光标,所以当我写回文件时,我得到了一个前缀为一堆空字节(对应于前面内容的大小)的文件,除非我事先使用了
file.Seek(0,0)

所以我的问题是:这是语言的一个bug,是在函数实现过程中被遗忘的东西,还是故意的,出于某种神秘的原因,这是一种期望的行为?那个神秘的原因可能是什么


我使用的是go版本go1.3.3Linux/amd64这是理想的行为:go实现模仿C的工作方式*。从手册页中:

文件偏移量未更改


*从技术上讲,这是因为Go实现。

这是期望的行为:Go实现模仿C的工作方式*。从手册页中:

文件偏移量未更改


*从技术上讲,这是因为Go实现。

您没有阅读吗?“它不会改变I/O偏移量”的部分。现在你说,I/O偏移量当时没有响铃,你没有读过吗?上面说“它不会改变I/O偏移量”的部分。现在您可以这么说,I/O偏移量当时并没有敲响警钟。对于这些事情,Go并不总是具有与C相同的语义,并且不需要参考C库文档。的Go文档明确指出“它不会更改I/O偏移量”(这是一个实现细节,他们可能会选择这些语义来匹配POSIX语义)。如果Go被移植到一个非POSIX系统,该系统要么缺少一个truncate调用,要么具有一个不同的语义,Go库将需要避免这种情况,并保留它自己的文档语义。对于这些事情,Go并不总是具有与C相同的语义,也不需要参考C库文档。的Go文档明确指出“它不会更改I/O偏移量”(这是一个实现细节,他们可能会选择这些语义来匹配POSIX语义)。如果Go被移植到一个非POSIX系统,该系统要么缺少truncate调用,要么具有不同的语义,那么Go库需要避免这种情况,并保留它自己的文档化语义。