網站首頁 編程語言 正文
前言
IO 操作是我們在編程中不可避免會遇到的,例如讀寫文件,Go語言的 io 包中提供了相關的接口,定義了相應的規范,不同的數據類型可以根據規范去實現相應的方法,提供更加豐富的功能。
Go 語言提倡小接口 + 接口組合的方式,來擴展程序的行為以及增加程序的靈活性。io代碼包恰恰就可以作為這樣的一個標桿,它可以成為我們運用這種技巧時的一個參考標準。io包中包含了大量接口,本篇文章我們就先來學習四個核心接口以及對應的接口組合。
Reader
io.Reader接口定義了 Read 方法,用于讀取數據到字節數組中:
- 入參:字節數組 p,會將數據讀入到 p 中
- 返回值:本次讀取的字節數 n,以及遇到的錯誤 err
type Reader interface { Read(p []byte) (n int, err error) }
方法功能詳解
- 方法讀取數據寫入到字節數組 p 中,由于 p 是有大小的,所以一次至多讀取 len(p) 個字節
- 方法返回讀取的數據字節數 n(0 <= n <= len(p)),以及讀取過程中遇到的 error
- 即使一次調用讀取到的數據小于 len(p),也可能會占用整個字節數組 p 作為暫存空間
- 如果數據源的數據量小于 len(p) 個字節,方法只會讀取當前可用數據,不會等待更多數據的到來
何時返回error
- 在成功讀取了 n(n>0)個字節后,如果產生了 error 或者 讀到文件末尾 (end-of-file),本次調用必須要返回讀取的字節數 n,但對于err 的值,可以選擇在本次直接返回 err(err!=nil),或者在下次調用的時候再返回 err (n=0, err!=nil)。常見的一個例子就是,讀取到n個字節后到達文件末尾(EOF),此時可以返回 err=EOF 或者 err=nil,下次調用返回 n=0,err=EOF。
- 調用者需要注意,每次調用后,如果 n>0,應該先處理數據,再考慮 err 是否為 nil。因為上一點已經指出,如果讀取到 n>0 個字節后遇到 error,會同時返回 n>0 和 err!=nil,此時就需要先處理數據再考慮 err。
方法實現和調用需注意
- 如果想要實現該方法,不推薦同時返回 n=0 和 err=nil,除非 len(p)=0
- 如果調用該該方法返回 n=0 和 err=nil,可以認為什么都沒有發生,不能認為是讀到文件末尾了(end-of-file)
- 實現該方法后,一定不要持有字節數組p (保留下地址做他用)
Writer
io.Writer接口定義了 Write 方法,用于寫數據到文件中
- 入參:字節數組 p,會將 p 中的數據寫入到文件中
- 返回值:成功寫入完成的字節數 n,以及遇到的錯誤 err
type Writer interface { Write(p []byte) (n int, err error) }
方法功能詳解
- 該方法將 p 中的數據寫到文件中
- 方法返回成功寫入的字節數 n(0 <= n <= len(p)),以及寫入過程中遇到的錯誤 err
- 如果 n<len(p),方法必須返回 err!=nil
- 方法一定不能修改字節數組 p,即使是臨時修改也不被允許
方法實現需注意
實現該方法后,一定不要持有字節數組p,只是用來讀取數據
Closer
io.Closer接口定義了 Close 方法,該方法用于關閉連接。
方法實現需注意
第一次調用該方法后,再次調用該方法應該產生什么行為,該接口沒有定義,依賴實現方法自定義。
type Closer interface { Close() error }
Seeker
io.Seeker接口定義了 Seek 方法,該方法用于指定下次讀取或者寫入時的偏移量
入參:計算新偏移量的起始值 whence, 基于whence的偏移量offset
返回值:基于 whence 和 offset 計算后新的偏移量值,以及可能產生的錯誤
type Seeker interface { Seek(offset int64, whence int) (int64, error) }
方法功能詳解
io包中定義了如下三種 whence
const ( SeekStart = 0 // 基于文件開始位置 SeekCurrent = 1 // 基于當前偏移量 SeekEnd = 2 // 基于文件結束位置 )
如果計算后新的偏移量,在文件起始位置之前,返回 error!=nil
任意正數的偏移量都是合法的,但是對數據源如何進行I/O操作,依賴具體的實現方法
組合接口
在go語言中,可以利用接口的組合,來囊括其他接口中的方法,類似于定義了一個父接口,可以包含多個子接口。如果一個 struct 實現了所有子接口的方法,也就相當于實現了父接口。小接口 + 接口組合的方式,很大程度上增加了程序的靈活性,在我們自己業務開發過程中,可以借鑒這種做法。
針對上面四個最小粒度的接口,io包定義了如下幾種組合接口:
// ReadWriter 是 Read 和 Write 方法的組合 type ReadWriter interface { Reader Writer } // ReadCloser 是 Read 和 Close 方法的組合 type ReadCloser interface { Reader Closer } // WriteCloser 是 Write 和 Close 方法的組合 type WriteCloser interface { Writer Closer } // ReadWriteCloser 是 Read、Write 和 Close 方法的組合 type ReadWriteCloser interface { Reader Writer Closer } // ReadSeeker 是 Read 和 Seek 方法的組合 type ReadSeeker interface { Reader Seeker } // WriteSeeker 是 Write 和 Seek 方法的組合 type WriteSeeker interface { Writer Seeker } // ReadWriteSeeker 是 Read、Write 和 Seek 方法的組合 type ReadWriteSeeker interface { Reader Writer Seeker }
總結
本篇文章介紹了 io包 中的四大核心接口:
- Reader : 讀取文件中的數據到字節數組中
- Writer : 將字節數組的數據寫入到文件中
- Closer : 用于關閉連接
- Seeker : 給定 whence 和 offset,計算得出新的offset,用于在特定位置開始讀寫
可以看到 Reader 和 Writer 接口中定義的方法中,都有字節數組p,而底層要操作的文件在方法中都沒有體現。Read方法是將文件的數據讀入字節數組p,Write 是將字節數組p的數據寫入文件,這一點不要記混。
原文鏈接:https://juejin.cn/post/7041579897818447903
相關推薦
- 2024-02-16 SpringBoot 全局異常處理
- 2022-12-05 服務啟動項Start類型詳解_其它
- 2022-07-18 Liunx下使用SSH登錄遠程服務器
- 2022-08-13 解決Artifact spbjh:war exploded: Error during artifa
- 2022-12-07 C++?二維(多維)vector添加一個空項問題_C 語言
- 2022-03-28 關于Qt添加opencv和libtorch庫的問題_C 語言
- 2022-04-06 教你用Python尋找重復文件并刪除的腳本寫法_python
- 2022-06-06 webpack4.0-解決webpack 報The 'mode' option has not be
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支