本文目錄一覽:
Golang:I/O 操作,千萬不要小瞧這些知識點
I/O 操作也叫輸入輸出操作。其中 I 是指 Input,O 是指 Output,用於讀或者寫數據的,有些語言中也叫流操作,是指數據通信的通道。
Golang 標準庫對 IO 的抽象非常精巧,各個組件可以隨意組合,可以作為介面設計的典範。
io 包中提供 I/O 原始操作的一系列介面。它主要包裝了一些已有的實現,如 os 包中的那些,並將這些抽象成為實用性的功能和一些其他相關的介面。
在 io 包中最重要的是兩個介面:Reader 和 Writer 介面,首先來介紹這讀的操作。
Reader 介面的定義,Read() 方法用於讀取數據。
Read 將 len(p) 個位元組讀取到 p 中。它返回讀取的位元組數 n(0 = n = len(p))以及任何遇到的錯誤。即使 Read 返回的 n len(p),它也會在調用過程
中使用 p 的全部作為暫存空間。若一些數據可用但不到 len(p) 個位元組,Read 會照例返回可用的東西,而不是等待更多。
當 Read 在成功讀取 n 0 個位元組後遇到一個錯誤或 EOF 情況,它就會返回讀取的位元組數,這種一般情況的一個例子就是 Reader 在輸入流結束時會返回一個非零的位元組數,可能的返回不是 err == EOF 就是 err == nil。無論如何,下一個 Read 都應當返回 0、EOF。
調用者應當總在考慮到錯誤 err 前處理 n 0 的位元組。這樣做可以在讀取一些位元組,以及允許的 EOF 行為後正確地處理 I/O 錯誤。
Read 的實現會阻止返回零位元組的計數和一個 nil 錯誤,調用者應將這種情況視作空操作。
ReaderFrom介面的定義,封裝了基本的 ReadFrom 方法。
ReadFrom 從 r 中讀取數據到對象的數據流中,直到 r 返回 EOF 或 r 出現讀取錯誤為止,返回值 n 是讀取的位元組數,返回值 err 就是 r 的返回值 err。
定義ReaderAt介面,ReaderAt 介面封裝了基本的 ReadAt 方法
ReadAt 從對象數據流的 off 處讀出數據到 p 中,忽略數據的讀寫指針,從數據的起始位置偏移 off 處開始讀取,如果對象的數據流只有部分可用,不足以填滿 p,則 ReadAt 將等待所有數據可用之後,繼續向 p 中寫入,直到將 p 填滿後再返回。
在這點上 ReadAt 要比 Read 更嚴格,返回讀取的位元組數 n 和讀取時遇到的錯誤,如果 n len(p),則需要返回一個 err 值來說明,為什麼沒有將 p 填滿(比如 EOF),如果 n = len(p),而且對象的數據沒有全部讀完,則 err 將返回 nil,如果 n = len(p),而且對象的數據剛好全部讀完,則 err 將返回 EOF 或者 nil(不確定)
file 類是在 os 包中的,封裝了底層的文件描述符和相關信息,同時封裝了 Read 和 Write 的實現。
讀取文件中的數據:
Writer 介面的定義,Write() 方法用於寫出數據。
Write 將 len(p) 個位元組從 p 中寫入到基本數據流中。它返回從 p 中被寫入的位元組數 n(0 = n = len(p))以及任何遇到的引起寫入提前停止的錯誤。若 Write 返回的 n len(p),它就必須返回一個非 nil 的錯誤。Write 不能修改此切片的數據,即便它是臨時的。
Seeker介面的定義,封裝了基本的 Seek 方法。
Seeker 用來移動數據的讀寫指針,Seek 設置下一次讀寫操作的指針位置,每次的讀寫操作都是從指針位置開始的。
whence 的含義:
如果 whence 為 0:表示從數據的開頭開始移動指針
如果 whence 為 1:表示從數據的當前指針位置開始移動指針
如果 whence 為 2:表示從數據的尾部開始移動指針
offset 是指針移動的偏移量
返回移動後的指針位置和移動過程中遇到的任何錯誤
WriterTo介面的定義,封裝了基本的 WriteTo 方法。
WriterTo 將對象的數據流寫入到 w 中,直到對象的數據流全部寫入完畢或遇到寫入錯誤為止。返回值 n 是寫入的位元組數,返回值 err 就是 w 的返回值 err。
定義WriterAt介面,WriterAt 介面封裝了基本的 WriteAt 方法
WriteAt 將 p 中的數據寫入到對象數據流的 off 處,忽略數據的讀寫指針,從數據的起始位置偏移 off 處開始寫入,返回寫入的位元組數和寫入時遇到的錯誤。如果 n len(p),則必須返回一個 err 值來說明為什麼沒有將 p 完全寫入
file 類是在 os 包中的,封裝了底層的文件描述符和相關信息,同時封裝了 Read 和 Write 的實現。
寫出數據到本地文件:
每天一個知識點:了解 Golang 引用數據類型
Golang的引用類型包括 slice、map 和 channel。它們有複雜的內部結構,除了申請內存外,還需要初始化相關屬性。對於引用類型,變數存儲的是一個地址,這個地址存儲最終的值。內存通常在堆上分配,通過GC回收。獲取指針類型所指向的值,使用:” * ” 取值符號 。比如:var *p int, 使用 *p 獲取 p 指向的值。
知識分享之Golang——精選的組件庫、組件列表,各種golang組件都可找到
知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄,將其整理出來以文章的形式分享給大家,來進行共同學習。歡迎大家進行持續關注。
知識分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go 這個組件包含了各種golang中常用的組件,說白了就是一個精選的 Go 框架、庫和軟體的匯總表。
我們日常需要尋找各種golang組件時在這個列表中基本都可以快速找到。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/243794.html