我最近尝试使用os.Truncate
参数为0来清除文件的内容,然后将修改后的版本重写到其中(我知道这是一种非常不安全的做法,但文件的内容对我来说并不重要)。
令我震惊的是Truncate没有重置文件的光标,所以当我写回文件时,我最后得到一个前缀为一堆空字节的文件(对应于前面内容的大小),除非事先使用file.Seek(0, 0)
。
所以我的问题是:这是一种语言的错误,在执行该功能时被遗忘的东西,还是故意的,并且出于某种神秘的原因它是一种理想的行为?可能是什么神秘的原因?
我正在使用go版本go1.3.3 linux / amd64
答案 0 :(得分:6)
这是期望的行为:Go实现模仿C的工作原理*。来自ftruncate(2)的手册页:
文件偏移量未更改。
*从技术上讲,这是因为Go实现executes the ftruncate(2)
syscall。