2015-09-05 31 views
0

我最近嘗試使用參數爲0的os.Truncate在重寫一個修改後的版本之前清除文件的內容(我知道這是一個非常不安全的做法,但文件的內容對我來說並不重要)。Go os.Truncate()不重置文件光標

令我震驚的是截斷沒有重置文件的光標,所以當我寫回文件時,我最終得到一個帶有一堆空字符的前綴(對應於前一內容的大小) ,除非事先使用file.Seek(0, 0)

所以我的問題是:是語言的錯誤,是在執行該功能時被遺忘的東西,還是故意的,它是出於某種神祕原因的理想行爲?那可能是那個神祕的原因?

我使用去版本的linux go1.3.3/AMD64

+0

你沒看過[文檔](https://golang.org/pkg/os/#File.Truncate)嗎?表示「它不會更改I/O偏移量」的部分。 –

+0

現在你說,I/O offset在此刻沒有響鈴 – deb0ch

回答

6

這是期望的行爲:圍棋實現模擬的C是如何工作的*。從ftruncate(2)的手冊頁:

文件偏移不會更改。

*從技術上講,這是因爲Go執行executes the ftruncate(2) syscall

+0

對於這些東西,Go並不總是具有與C相同的語義,並且不需要引用C庫文檔。 ['os.File.Truncate']的Go文檔(https://golang.org/pkg/os/#File.Truncate)明確指出:「它不會改變I/O偏移量」(這是一個實現細節他們可能選擇了這些語義來匹配POSIX語義)。如果Go被移植到非POSIX系統,該系統可能缺少截斷調用或者具有不同語義的系統,Go庫需要避免這種情況並保留自己記錄的語義。 –