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

Go語(yǔ)言中io.Reader和io.Writer的詳解與實(shí)現(xiàn)

 更新時(shí)間:2016年09月01日 09:17:15   投稿:daisy  
在Go語(yǔ)言的實(shí)際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開(kāi),接口是Go語(yǔ)言中所有數(shù)據(jù)結(jié)構(gòu)的核心。在使用Go語(yǔ)言的過(guò)程中,無(wú)論你是實(shí)現(xiàn)web應(yīng)用程序,還是控制臺(tái)輸入輸出,又或者是網(wǎng)絡(luò)操作,不可避免的會(huì)遇到IO操作,使用到io.Reader和io.Writer接口。下面來(lái)詳細(xì)看看。

一、前言

也許對(duì)這兩個(gè)接口和相關(guān)的一些接口很熟悉了,但是你腦海里確很難形成一個(gè)對(duì)io接口的繼承關(guān)系整天的概貌,原因在于godoc缺省并沒(méi)有像javadoc一樣顯示官方庫(kù)繼承關(guān)系,這導(dǎo)致了我們對(duì)io接口的繼承關(guān)系記憶不深,在使用的時(shí)候還經(jīng)常需要翻文檔加深記憶。

本文試圖梳理清楚Go io接口的繼承關(guān)系,提供一個(gè)io接口的全貌。

二、io接口回顧

首先我們回顧一下幾個(gè)常用的io接口。標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)是將功能細(xì)分,每個(gè)最小粒度的功能定義成一個(gè)接口,然后接口可以組成成更多功能的接口。

最小粒度的接口

type Reader interface {
  Read(p []byte) (n int, err error)
}
type Writer interface {
  Write(p []byte) (n int, err error)
}
type Closer interface {
  Close() error
}
type Seeker interface {
  Seek(offset int64, whence int) (int64, error)
}
type ReaderFrom interface {
  ReadFrom(r Reader) (n int64, err error)
}
type WriterTo interface {
  WriteTo(w Writer) (n int64, err error)
}
type ReaderAt interface {
  ReadAt(p []byte, off int64) (n int, err error)
}
type WriterAt interface {
  WriteAt(p []byte, off int64) (n int, err error)
}

以及

type ByteReader interface {
  ReadByte() (byte, error)
}
type ByteWriter interface {
  WriteByte(c byte) error
}

ByteScanner比ByteReader多了一個(gè)UnreadByte方法。

type ByteScanner interface {
  ByteReader
  UnreadByte() error
}
type RuneReader interface {
  ReadRune() (r rune, size int, err error)
}
type RuneScanner interface {
  RuneReader
  UnreadRune() error
}

組合接口

Go標(biāo)準(zhǔn)庫(kù)還定義了一些由上面的單一職能的接口組合而成的接口。

type ReadCloser interface {
  Reader
  Closer
}
type ReadSeeker interface {
  Reader
  Seeker
}
type ReadWriter interface {
  Reader
  Writer
}
type ReadWriteCloser interface {
  Reader
  Writer
  Closer
}
type ReadWriteSeeker interface {
  Reader
  Writer
  Seeker
}
type WriteCloser interface {
  Writer
  Closer
}
type WriteSeeker interface {
  Writer
  Seeker
}

從它們的定義上可以看出,它們是最小粒度的組合。

最小接口的擴(kuò)展

有些結(jié)構(gòu)體struct實(shí)現(xiàn)并且擴(kuò)展了接口,這些結(jié)構(gòu)體是。

type LimitedReader struct {
  R Reader // underlying reader
  N int64 // max bytes remaining
}
type PipeReader struct {
  // contains filtered or unexported fields
}
type PipeWriter struct {
  // contains filtered or unexported fields
}
type SectionReader struct {
  // contains filtered or unexported fields
}

下面我會(huì)將它們的繼承關(guān)系畫出來(lái)。

一些輔助方法

一些輔助方法可以生成特殊類型的Reader或者Writer:

func LimitReader(r Reader, n int64) Reader
func MultiReader(readers ...Reader) Reader
func TeeReader(r Reader, w Writer) Reader
func MultiWriter(writers ...Writer) Writer

三、繼承關(guān)系

當(dāng)然,Go語(yǔ)言中并沒(méi)有Java中那樣的繼承關(guān)系,而是基于duck type形式實(shí)現(xiàn),我用下圖嘗試展示Go io接口的繼承關(guān)系。

    其中黃色是 bufio 包下的類型,

    綠色是 archive.tar 包下的類型,

    藍(lán)色是 bytes 包下的類型,

    粉紅色是 strings包下的類型,

    紫色是 crypto.tls 包下的類型。

Rand是math.rand包下的類型。

File是os包下的內(nèi)容。

`Rand`左邊的那個(gè)Reader是image.jpeg下的內(nèi)容。

我們最常用的是包io、bytes、bufio下的類型,所以這幾個(gè)包下的類型要記牢,在第三庫(kù)中經(jīng)常會(huì)出現(xiàn)它們的身影。

上圖中并沒(méi)有把mime/multipart.File和 net/http.File列出來(lái),主要是圖太復(fù)雜了,它們實(shí)現(xiàn)的接口和os.File類似。

當(dāng)然你可能會(huì)問(wèn),你怎么整理的它們的繼承關(guān)系?事實(shí)上,你可以通過(guò)godoc -analysis=type -http=:6060生成帶繼承關(guān)系的Go doc,并且它還可以將你本地下載的庫(kù)中的繼承關(guān)系也顯示出來(lái)。

四、總結(jié)

以上就是關(guān)于Go語(yǔ)言中io.Reader和io.Writer的詳解與實(shí)現(xiàn)的全部?jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)和工作能有所幫助,如果有疑問(wèn)可以留言交流。

相關(guān)文章

  • GO語(yǔ)言并發(fā)之好用的sync包詳解

    GO語(yǔ)言并發(fā)之好用的sync包詳解

    標(biāo)準(zhǔn)庫(kù)中的sync包在我們的日常開(kāi)發(fā)中用的頗為廣泛,那么大家對(duì)sync包的用法知道多少呢,這篇文章就大致講一下sync包和它的使用,感興趣的可以學(xué)習(xí)一下
    2022-12-12
  • Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn)

    Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn)

    Golang服務(wù)請(qǐng)求調(diào)度是一種使用Go語(yǔ)言實(shí)現(xiàn)的服務(wù)請(qǐng)求管理方法,本文主要介紹了Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Qt6.5 grpc組件使用 + golang grpc server示例詳解

    Qt6.5 grpc組件使用 + golang grpc server

    這篇文章主要介紹了Qt6.5 grpc組件使用+golang grpc server示例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言中rune方法使用詳解

    Go語(yǔ)言中rune方法使用詳解

    本文主要介紹了Go語(yǔ)言中rune方法使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • go開(kāi)源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    go開(kāi)源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    這篇文章主要為大家介紹了go開(kāi)源項(xiàng)目中發(fā)現(xiàn)的一個(gè)邏輯鬼才寫法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Golang中make與new使用區(qū)別小結(jié)

    Golang中make與new使用區(qū)別小結(jié)

    Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類型內(nèi)存,本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理分析

    Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理,HTTP服務(wù)的超時(shí)控制是保障服務(wù)高可用性的重要措施之一,由于HTTP服務(wù)可能會(huì)遇到網(wǎng)絡(luò)延遲,資源瓶頸等問(wèn)題,因此需要對(duì)請(qǐng)求進(jìn)行超時(shí)控制,以避免服務(wù)雪崩等問(wèn)題,需要的朋友可以參考下
    2023-05-05
  • Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下
    2017-02-02
  • golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法詳解

    golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法詳解

    這篇文章主要介紹了golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法

    go項(xiàng)目實(shí)現(xiàn)mysql接入及web?api的操作方法

    這篇文章主要介紹了go項(xiàng)目實(shí)現(xiàn)mysql接入以及web api,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08

最新評(píng)論