欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中的io.ReadCloser與ioutil.NopCloser使用

 更新時間:2024年03月28日 15:12:44   作者:raoxiaoya  
這篇文章主要介紹了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.Requestresponse *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ī)制的用法詳解

    Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    反射的本質(zhì)就是在程序運行的時候,獲取對象的類型信息和內(nèi)存結(jié)語構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下
    2022-06-06
  • golang 自旋鎖的實現(xiàn)

    golang 自旋鎖的實現(xiàn)

    這篇文章主要介紹了golang 自旋鎖的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 淺談一下前端http與https有什么區(qū)別

    淺談一下前端http與https有什么區(qū)別

    這篇文章主要介紹了淺談一下前端http與https有什么區(qū)別,現(xiàn)今大部分的網(wǎng)站都已經(jīng)使用了 https 協(xié)議,那么https對比http協(xié)議有哪些不同呢,需要的朋友可以參考下
    2023-04-04
  • golang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • vscode如何debug調(diào)試golang代碼

    vscode如何debug調(diào)試golang代碼

    古話說工欲善其事必先利其器,Go語言程序的開發(fā)者而言,當(dāng)下最火的IDE應(yīng)該非微軟的Visual Studio Code莫屬,本文主要介紹了vscode如何debug調(diào)試golang代碼,感興趣的可以了解一下
    2024-03-03
  • 十個Go map面試常考問題合集

    十個Go map面試??紗栴}合集

    go面試中,map相關(guān)知識點問的比較多,這篇文章主要為大家整理歸納了10個常考的問題,文中的示例代碼講解詳細(xì),希望對大家有一定的幫助
    2023-07-07
  • Golang中使用不定數(shù)量空格分割字符串的方法

    Golang中使用不定數(shù)量空格分割字符串的方法

    有這樣一個使用空格分割字符串的場景,字符串中被分割的子串之間的空格數(shù)量不確定,有一個兩個或者多個空格,這種場景下,使用最容易想到的strings.Split函數(shù)就做不到了,本文接下來就介紹幾種行之有效的方法,需要的朋友可以參考下
    2023-07-07
  • 一文讀懂go中semaphore(信號量)源碼

    一文讀懂go中semaphore(信號量)源碼

    這篇文章主要介紹了一文讀懂go中semaphore(信號量)源碼的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Go語言HTTPServer開發(fā)的六種方式小結(jié)

    Go語言HTTPServer開發(fā)的六種方式小結(jié)

    Golang的Server開發(fā)顯得非常簡單,有很多種方式,本文就介紹了Go語言HTTPServer開發(fā)的六種方式,具有一定的參考價值,感興趣的可以了解一下
    2021-11-11
  • GO語言的map類型實例詳解

    GO語言的map類型實例詳解

    這篇文章主要介紹了GO語言的map類型實例詳解,包括對map的創(chuàng)建,賦值,排序,刪除,等操作需要的朋友可以參考下
    2022-12-12

最新評論