Go語言中Reader介面定義了一個Read操作,實作了Reader介面的都有Read這個函數。 (建議學習:go)
介面的定義如下:
type Reader interface { Read(p []byte) (n int, err error) }
一次Read呼叫最多讀取len( p)位元組的資料到緩衝區p
n表示這次實際讀取到位元組數,(0 bf44f82f07a336968d9ee9f61508959a0)和err(非nil)
或本次Read操作返回n(>0)和nil,下次呼叫的時候再回傳0和err(非nil)
這兩種操作都是可能的,所以呼叫者永遠應該先按照n>0來判定是否有數據返回,而不是先判定err是否為nil
舉個例子說明,當某次調用到達文件末尾並且還讀取到了n位元組資料的時候,Reader的實作可能有兩種方式:
目前呼叫回傳n和EOF error
目前呼叫回傳n和nil,下次呼叫回傳0和EOF
Read的實作不應該回傳0和nil,也就是當回傳0的時候就應該回傳一個非nil的error,除非緩衝空間的大小為0,然後呼叫者應該忽略呼叫0和nil這種回傳值組合,當作什麼都沒發生,特別強調一下,這個回傳並不表示EOF了
以上是golang read會阻塞麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!