Go語言中Reader介面定義了一個Read操作,實作了Reader介面的都有Read這個函數。 (建議學習:go)
介面的定義如下:
type Reader interface { Read(p []byte) (n int, err error) }
一次Read呼叫最多讀取len( p)位元組的資料到緩衝區p
n表示這次實際讀取到位元組數,(0 <= n <= len(p))
err表示這次讀取操作的報錯(如果有的話,沒有則是nil)
即使讀取到的位元組數n小於len(p),在函數呼叫過程中呼叫主體也可能使用全部的p的空間(不知道這個說明是想表達什麼)
當read到資料的時候,即使不夠len(p)(此時IO快取中沒有資料了),Read操作通常會直接返回獲取到的資料而不是繼續等待IO快取中到達更多的資料
當Read操作在成功讀取到n位元組資料後遇到一個錯誤或檔案的末尾,它將會傳回讀取的n位元組數據,然後err的回傳可能有兩種操作:
在本次Read操作的時候回傳n(>0)和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中文網其他相關文章!