golang中的io.ReadCloser與ioutil.NopCloser使用
io.ReadCloser與ioutil.NopCloser使用
type ReadCloser interface { Reader Closer }
type nopCloser struct { io.Reader } func (nopCloser) Close() error { return nil } // NopCloser returns a ReadCloser with a no-op Close method wrapping // the provided Reader r. func NopCloser(r io.Reader) io.ReadCloser { return nopCloser{r} }
ioutil.NopCloser
返回一個 io.ReadCloser
,并且 close()
方法沒有任何操作 no-op
。
我們在操作req *http.Request
和response *http.Response
的時候,有時候需要讀取Body
,但是讀了之后Body
里面就被清空了,因此我們需要將讀取的內(nèi)容又重新賦值給Body
。
它的類型為io.ReadCloser
。
func(response *http.Response) error { cont, _ := ioutil.ReadAll(response.Body) fmt.Println(string(cont)) response.Body = ioutil.NopCloser(bytes.NewReader(cont)) return nil }
golang中的ioutil和log包
- func NopCloser
?func NopCloser(r io.Reader) io.ReadCloser?
NopCloser用一個無操作的Close方法包裝r返回一個ReadCloser接口。
- func ReadAll
?func ReadAll(r io.Reader) ([]byte, error)?
ReadAll從r讀取數(shù)據(jù)直到EOF或遇到error,返回讀取的數(shù)據(jù)和遇到的錯誤。
成功的調(diào)用返回的err為nil而非EOF。
因為本函數(shù)定義為讀取r直到EOF,它不會將讀取返回的EOF視為應(yīng)報告的錯誤。
- func ReadFile
?func ReadFile(filename string) ([]byte, error)?
ReadFile 從filename指定的文件中讀取數(shù)據(jù)并返回文件的內(nèi)容。
成功的調(diào)用返回的err為nil而非EOF。
因為本函數(shù)定義為讀取整個文件,它不會將讀取返回的EOF視為應(yīng)報告的錯誤。
- func WriteFile
?func WriteFile(filename string, data []byte, perm os.FileMode) error?
函數(shù)向filename指定的文件中寫入數(shù)據(jù)。
如果文件不存在將按給出的權(quán)限創(chuàng)建文件,否則在寫入數(shù)據(jù)之前清空文件。
- func ReadDir
?func ReadDir(dirname string) ([]os.FileInfo, error)?
返回dirname指定的目錄的目錄信息的有序列表。
- func TempDir
?func TempDir(dir, prefix string) (name string, err error)?
在dir目錄里創(chuàng)建一個新的、使用prfix作為前綴的臨時文件夾,并返回文件夾的路徑。
如果dir是空字符串,TempDir使用默認(rèn)用于臨時文件的目錄(參見os.TempDir函數(shù))。
不同程序同時調(diào)用該函數(shù)會創(chuàng)建不同的臨時目錄,調(diào)用本函數(shù)的程序有責(zé)任在不需要臨時文件夾時摧毀它。
- func TempFile
?func TempFile(dir, prefix string) (f *os.File, err error)?
在dir目錄下創(chuàng)建一個新的、使用prefix為前綴的臨時文件,以讀寫模式打開該文件并返回os.File指針。
如果dir是空字符串,TempFile使用默認(rèn)用于臨時文件的目錄(參見os.TempDir函數(shù))。
不同程序同時調(diào)用該函數(shù)會創(chuàng)建不同的臨時文件,調(diào)用本函數(shù)的程序有責(zé)任在不需要臨時文件時摧毀它。
- io func (*PipeReader) Read
?func (r *PipeReader) Read(data []byte) (n int, err error)?
Read實現(xiàn)了標(biāo)準(zhǔn)Reader接口:它從管道中讀取數(shù)據(jù),會阻塞直到寫入端開始寫入或?qū)懭攵吮魂P(guān)閉。
- func (*PipeReader) Close
?func (r *PipeReader) Close() error?
Close關(guān)閉讀取器;關(guān)閉后如果對管道的寫入端進(jìn)行寫入操作,就會返回(0, ErrClosedPip)。
- func (*PipeReader) CloseWithError
?func (r *PipeReader) CloseWithError(err error) error?
CloseWithError類似Close方法,但將調(diào)用Write時返回的錯誤改為err。
- type PipeWriter
type PipeWriter struct { // 內(nèi)含隱藏或非導(dǎo)出字段 }
PipeWriter是一個管道的寫入端。
- func (*PipeWriter) Write
?func (w *PipeWriter) Write(data []byte) (n int, err error)?
Write實現(xiàn)了標(biāo)準(zhǔn)Writer接口:它將數(shù)據(jù)寫入到管道中,會阻塞直到讀取器讀完所有的數(shù)據(jù)或讀取端被關(guān)閉。
- func (*PipeWriter) Close
?func (w *PipeWriter) Close() error?
Close關(guān)閉寫入器;關(guān)閉后如果對管道的讀取端進(jìn)行讀取操作,就會返回(0, EOF)。
- func (*PipeWriter) CloseWithError
?func (w *PipeWriter) CloseWithError(err error) error?
CloseWithError類似Close方法,但將調(diào)用Read時返回的錯誤改為err。
- func TeeReader
?func TeeReader(r Reader, w Writer) Reader?
TeeReader返回一個將其從r讀取的數(shù)據(jù)寫入w的Reader接口。
所有通過該接口對r的讀取都會執(zhí)行對應(yīng)的對w的寫入。
沒有內(nèi)部的緩沖:寫入必須在讀取完成前完成。
寫入時遇到的任何錯誤都會作為讀取錯誤返回。
- func MultiReader
??func TeeReader(r Reader, w Writer) Reader??
MultiReader返回一個將提供的Reader在邏輯上串聯(lián)起來的Reader接口。
他們依次被讀取。當(dāng)所有的輸入流都讀取完畢,Read才會返回EOF。
如果readers中任一個返回了非nil非EOF的錯誤,Read方法會返回該錯誤。
- func MultiWriter
?func MultiWriter(writers ...Writer) Writer?
MultiWriter創(chuàng)建一個Writer接口,會將提供給其的數(shù)據(jù)寫入所有創(chuàng)建時提供的Writer接口。
- func Copy
?func Copy(dst Writer, src Reader) (written int64, err error)?
將src的數(shù)據(jù)拷貝到dst,直到在src上到達(dá)EOF或發(fā)生錯誤。
返回拷貝的字節(jié)數(shù)和遇到的第一個錯誤。
對成功的調(diào)用,返回值err為nil而非EOF,因為Copy定義為從src讀取直到EOF,它不會將讀取到EOF視為應(yīng)報告的錯誤。
如果src實現(xiàn)了WriterTo接口,本函數(shù)會調(diào)用src.WriteTo(dst)進(jìn)行拷貝;否則如果dst實現(xiàn)了ReaderFrom接口,本函數(shù)會調(diào)用dst.ReadFrom(src)進(jìn)行拷貝。
- func CopyN
?func CopyN(dst Writer, src Reader, n int64) (written int64, err error)?
從src拷貝n個字節(jié)數(shù)據(jù)到dst,直到在src上到達(dá)EOF或發(fā)生錯誤。
返回復(fù)制的字節(jié)數(shù)和遇到的第一個錯誤。
只有err為nil時,written才會等于n。
如果dst實現(xiàn)了ReaderFrom接口,本函數(shù)很調(diào)用它實現(xiàn)拷貝。
- func ReadAtLeast
?func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)?
ReadAtLeast從r至少讀取min字節(jié)數(shù)據(jù)填充進(jìn)buf。
函數(shù)返回寫入的字節(jié)數(shù)和錯誤(如果沒有讀取足夠的字節(jié))。
只有沒有讀取到字節(jié)時才可能返回EOF;如果讀取了有但不夠的字節(jié)時遇到了EOF,函數(shù)會返回ErrUnexpectedEOF。
如果min比buf的長度還大,函數(shù)會返回ErrShortBuffer。
只有返回值err為nil時,返回值n才會不小于min。
- func ReadFull
?func ReadFull(r Reader, buf []byte) (n int, err error)?
ReadFull從r精確地讀取len(buf)字節(jié)數(shù)據(jù)填充進(jìn)buf。
函數(shù)返回寫入的字節(jié)數(shù)和錯誤(如果沒有讀取足夠的字節(jié))。
只有沒有讀取到字節(jié)時才可能返回EOF;如果讀取了有但不夠的字節(jié)時遇到了EOF,函數(shù)會返回ErrUnexpectedEOF。
只有返回值err為nil時,返回值n才會等于len(buf)。
- func WriteString
?func WriteString(w Writer, s string) (n int, err error)?
WriteString函數(shù)將字符串s的內(nèi)容寫入w中。
如果w已經(jīng)實現(xiàn)了WriteString方法,函數(shù)會直接調(diào)用該方法。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golang學(xué)習(xí)之反射機(jī)制的用法詳解
反射的本質(zhì)就是在程序運行的時候,獲取對象的類型信息和內(nèi)存結(jié)語構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下2022-06-06Go語言HTTPServer開發(fā)的六種方式小結(jié)
Golang的Server開發(fā)顯得非常簡單,有很多種方式,本文就介紹了Go語言HTTPServer開發(fā)的六種方式,具有一定的參考價值,感興趣的可以了解一下2021-11-11