golang IO操作

包IO提供I/O原語的基本接口衔蹲。它的主要任務(wù)是包裝這些原語的現(xiàn)有實(shí)現(xiàn)

1.Reader讀取器

Reader是一個(gè)包裹基本讀方法的接口,Read讀取len(p)個(gè)bytes到p中勾扭,返回值n代表讀取到的bytes數(shù)囱怕,值范圍為大于等于0小于等于len(p).err為讀取過程遇到的錯(cuò)誤紧武。即使read返回n<len(p),它也可以在調(diào)用期間使用p的所有部分作為臨時(shí)空間按厘。read通常返回可用的內(nèi)容抵恋,而不是等待更多內(nèi)容。
該接口只有Read一個(gè)方法挠日,任何實(shí)現(xiàn)了該方法的類型都可以說是實(shí)現(xiàn)了讀取器的功能疮绷。在參數(shù)類型為Reader時(shí),都可以當(dāng)做Reader類型傳入嚣潜。
Read方法參數(shù)為一個(gè)字節(jié)切片冬骚,數(shù)據(jù)讀取,寫入到該切片中懂算,返回值類型為一個(gè)int類型只冻,標(biāo)識(shí)讀取到的字節(jié)數(shù),err標(biāo)識(shí)讀取過程中遇到的任何異常计技,當(dāng)讀取結(jié)束后喜德,err返回值為io.EOF.該值標(biāo)識(shí)讀取內(nèi)容結(jié)束,不能作為一般的異常處理垮媒。

type Reader interface {
    Read(p []byte) (n int, err error)
}

2.Writer

Writer是包裹了基本寫方法的接口舍悯。
Write從p中寫len(p)個(gè)字節(jié)到底層的數(shù)據(jù)流航棱,返回值n代表成功寫入的bytes數(shù),值范圍為0<=n<=len(p),err代表寫時(shí)遇到的錯(cuò)誤萌衬。Write必須返回一個(gè)非空的錯(cuò)誤丧诺,如果n<len(p),Write不能修改參數(shù)切片

type Writer interface {
    Write(p []byte) (n int, err error)
}

types.Buffer類型實(shí)現(xiàn)了Write方法。

// Write appends the contents of p to the buffer, growing the buffer as
// needed. The return value n is the length of p; err is always nil. If the
// buffer becomes too large, Write will panic with ErrTooLarge.
func (b *Buffer) Write(p []byte) (n int, err error) {
    b.lastRead = opInvalid
    m, ok := b.tryGrowByReslice(len(p))
    if !ok {
        m = b.grow(len(p))
    }
    return copy(b.buf[m:], p), nil
}
package main

import (
    "bytes"
    "fmt"
    "os"
)

func main() {
    mircors := []string{
        "Micro為構(gòu)建微服務(wù)提供了一些基本模板奄薇,",
        "目標(biāo)就是要讓開發(fā)分布式系統(tǒng)盡可能地簡化驳阎。",
        "因?yàn)槲⒎?wù)自身就是一個(gè)結(jié)構(gòu),",
        "所以micro希望通過工具在邏輯層面上進(jìn)行職責(zé)分離馁蒂。",
    }
    var writer bytes.Buffer

    for _, m := range mircors {
        n, err := writer.Write([]byte(m))
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        if n != len(m) {
            fmt.Println("write data error")
            os.Exit(1)
        }
    }

    fmt.Println(writer.String())
}

3.ReadWriter

// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
    Reader
    Writer
}

4.ReaderFrom

ReadFrom從r讀取數(shù)據(jù)直到遇到EOF或者error.

type ReaderFrom interface {
    ReadFrom(r Reader) (n int64, err error)
}

5.WriterTo

WriteTo向w中寫數(shù)據(jù)呵晚,直到?jīng)]有更多的數(shù)據(jù)可寫或者遇到錯(cuò)誤。

type WriterTo interface {
    WriteTo(w Writer) (n int64, err error)
}

6.ReaderAt

ReadAt讀取len(p)個(gè)字節(jié)到p從輸入源的off偏移量開始沫屡。返回讀取到的字節(jié)數(shù)和遇到的任何錯(cuò)誤饵隙。如果ReadAt返回的n<len(p),同時(shí)將返回一個(gè)非空的錯(cuò)誤,解釋了為什么返回的字節(jié)數(shù)少沮脖,在這種層面上金矛,ReadAt要嚴(yán)于Read.如果n=len(p), err == EOF或者err==nil.

type ReaderAt interface {
    ReadAt(p []byte, off int64) (n int, err error)
}

7.WriterAt

WriterAt將len(p)個(gè)字節(jié)從p中寫入到數(shù)據(jù)流中,寫入時(shí)從偏移量off開始勺届。返回寫入的字節(jié)數(shù)和任何遇到錯(cuò)誤驶俊。如果n<len(p),返回的err非空。

type WriterAt interface {
    WriteAt(p []byte, off int64) (n int, err error)
}

8.Copy

從src中復(fù)制數(shù)據(jù)到dst直到在src中遇到EOF,或者產(chǎn)生錯(cuò)誤免姿。返回復(fù)制的bytes數(shù)量饼酿,和復(fù)制中遇到的錯(cuò)誤。
一個(gè)成功的復(fù)制胚膊,返回的err==nil,而不是err==EOF.因?yàn)镃opy被定義為從src中讀取直到EOF.它并不會(huì)把EOF當(dāng)做一個(gè)錯(cuò)誤來對(duì)待故俐。如果src實(shí)現(xiàn)了WriterTo接口,copy通過調(diào)用src.WriteTo(dst)來實(shí)現(xiàn)紊婉。否則药版,如果dst實(shí)現(xiàn)了ReaderFrom接口,copy通過調(diào)用dst.ReadFrom(src)來實(shí)現(xiàn)喻犁。

func Copy(dst Writer, src Reader) (written int64, err error) {
    return copyBuffer(dst, src, nil)
}

示例:

package main

import (
    "fmt"
    "io/ioutil"
    "strings"
    "os"
    "io"
)
func main(){
    content, err := ioutil.ReadFile("./demo.go")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("file content: %s", content)
    r := strings.NewReader("Hello World!")
    n, err := io.Copy(os.Stdout, r)
    fmt.Printf("\n%d, %v", n, err)   //12, <nil>
}

9.StringWriter

將字符串內(nèi)容寫到w中槽片,接受一個(gè)字節(jié)切片,如果w實(shí)現(xiàn)了StringWriter接口株汉,則直接調(diào)用筐乳,調(diào)用w.Write方法。

type StringWriter interface {
    WriteString(s string) (n int, err error)
}

func WriteString(w Writer, s string) (n int, err error) {
    if sw, ok := w.(StringWriter); ok {
        return sw.WriteString(s)
    }
    return w.Write([]byte(s))
}

示例:


    nstr, errstr := io.WriteString(os.Stdout, "Hello world")
    fmt.Printf("\n%d, %v", nstr, errstr)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乔妈,一起剝皮案震驚了整個(gè)濱河市蝙云,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌路召,老刑警劉巖勃刨,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件波材,死亡現(xiàn)場離奇詭異,居然都是意外死亡身隐,警方通過查閱死者的電腦和手機(jī)廷区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贾铝,“玉大人隙轻,你說我怎么就攤上這事」缚” “怎么了玖绿?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叁巨。 經(jīng)常有香客問我斑匪,道長,這世上最難降的妖魔是什么锋勺? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任蚀瘸,我火速辦了婚禮,結(jié)果婚禮上庶橱,老公的妹妹穿的比我還像新娘贮勃。我一直安慰自己,他們只是感情好悬包,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布衙猪。 她就那樣靜靜地躺著,像睡著了一般布近。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丝格,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天撑瞧,我揣著相機(jī)與錄音,去河邊找鬼显蝌。 笑死预伺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曼尊。 我是一名探鬼主播酬诀,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼骆撇!你這毒婦竟也來了瞒御?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤神郊,失蹤者是張志新(化名)和其女友劉穎肴裙,沒想到半個(gè)月后趾唱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜻懦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年甜癞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛乃。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠咱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出征炼,到底是詐尸還是另有隱情乔煞,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布柒室,位于F島的核電站渡贾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雄右。R本人自食惡果不足惜空骚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擂仍。 院中可真熱鬧囤屹,春花似錦、人聲如沸逢渔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肃廓。三九已至智厌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盲赊,已是汗流浹背铣鹏。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合溺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓缀台,卻偏偏與公主長得像棠赛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理恭朗,服務(wù)發(fā)現(xiàn)屏镊,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • io包中最重要的是兩個(gè)接口:Reader和Writer Reader接口##### type Writer int...
    勿以浮沙筑高臺(tái)閱讀 16,287評(píng)論 0 5
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,803評(píng)論 0 38
  • 本文為轉(zhuǎn)載痰腮,原文:Golang 學(xué)習(xí)筆記(08)—— 文件操作 path 在path包中封裝了一些路徑相關(guān)的操作而芥,...
    ChainZhang閱讀 3,131評(píng)論 0 4
  • 或許會(huì)有后續(xù)……棍丐? 1.瑞金 “格瑞!”金大喊沧踏。 在這場混戰(zhàn)里格瑞漸漸有些顧不上金了歌逢,他接下嘉德羅斯的一擊,被...
    愿意嫁給我嗎閱讀 1,650評(píng)論 1 5