Go 的io包中的大多數輸出方法都返回(int, error),例如io.Writer的Write([]byte)方法和io.WriteString(io.Writer, string)函數。但是,一些輸出方法,例如io.WriterTo的WriteTo方法,(int64, error)反而返回。這使得不方便實現WriteTo在以下方面Write或WriteString不存儲的中間值,并輸入從將其轉換int到int64。這種差異的原因是什么?
2 回答

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
有可能WriteTo
復制超過 int32 字節的數據。
使用io.Reader
和io.Writer
接口,數據量受到給定切片大小的限制,int
對于當前架構,切片的長度限制為 。

婷婷同學_
TA貢獻1844條經驗 獲得超8個贊
Writer.Write()
方法簽名:
Write(p []byte) (n int, err error)
它寫入slice的內容。引用規范:切片類型:
切片是底層數組的連續段的描述符......
眾所周知,切片有一個底層數組。再次引用規范:數組類型:
長度是數組類型的一部分;它必須計算為可由 type 值表示的非負常量
int
。
因此數組的最大長度受int
類型最大值的限制(2147483647
在 32 位和9223372036854775807
64 位架構的情況下)。
所以回到Writer.Write()
方法:由于它寫入傳遞的切片的內容,因此可以保證寫入的字節數不會超過int
.
現在WriteTo.WriteTo()
方法:
WriteTo(w Writer) (n int64, err error)
沒有提到切片或數組。您無法保證結果將適合int
,因此int64
不僅僅是合理的。
例子: BigBuffer
想象一個BigBuffer
臨時將數據寫入數組或切片的實現。該實現可以管理多個數組,以便如果一個數組已滿(例如達到最大整數),則繼續另一個數組?,F在,如果 thisBigBuffer
實現了WriteTo
接口并且您調用此方法將內容寫入 an os.File
,則結果將大于 max int
。
- 2 回答
- 0 關注
- 283 瀏覽
添加回答
舉報
0/150
提交
取消