Go語言入門【四】:源碼學(xué)習(xí)-io

介紹

package io主要包含以下文件:

  • io.go 基礎(chǔ)的io操作岁经,如讀寫朋沮,較底層
  • multi.go 多個Reader封裝成一個
  • pipe.go
  • ioutil 常用操作
    • ioutil.go 封裝了ioutil
    • tempfile.go 有關(guān)創(chuàng)建臨時文件

Reader & Writer

這兩個接口是用途最廣的接口之一,所以重點(diǎn)學(xué)習(xí)一下缀壤,后續(xù)會用在os樊拓,net等各種常用包。

io.Reader

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

io.Writer

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

具體例子塘慕,以strings.Reader為例筋夏,代碼:

package strings
...

type Reader struct {
    s        string
    i        int64 // current reading index
    prevRune int   // index of previous rune; or < 0
}

func (r *Reader) Read(b []byte) (n int, err error) {
    if r.i >= int64(len(r.s)) {
        return 0, io.EOF
    }
    r.prevRune = -1
    n = copy(b, r.s[r.i:])
    r.i += int64(n)
    return
}

可見該類滿足io.Reader契約,所以使用時可以這樣(清晰起見图呢,以顯式類型編碼):

var strReader io.Reader = strings.NewReader("hello")
if _, err := io.Copy(os.Stdout, r); err != nil {
    log.Fatal(err)
}

從源碼來看条篷,
第一,實(shí)際上Reader就是封裝了序列化數(shù)據(jù)的一個容器蛤织。這一點(diǎn)從命名上來講可能不是那么明顯赴叹,從名字上看,可能Reader只是一個調(diào)用者指蚜,需要從別的地方去『讀取』數(shù)據(jù)乞巧,實(shí)際上大部分Reader本身包括了數(shù)據(jù)。
第二摊鸡,Reader類似我們現(xiàn)在的優(yōu)酷土豆播放器摊欠,能夠記住上一次播放的位置丢烘,每次去觀看都從上次看的接著看。

Copy

這個方法從前面也能看到十分常用
func Copy(dst Writer, src Reader) (written int64, err error)
作用是將src的內(nèi)容寫入到dst之中些椒,

注意播瞳,在buildin中有一個copy方法與之類似,
func copy(dst, src []Type) int
只不過是處理[]byte類型免糕。

查看io.Copy方法的源碼赢乓,我們發(fā)現(xiàn)其中調(diào)用了
func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
并默認(rèn)創(chuàng)建了一個buf,代碼如下

if buf == nil {
    buf = make([]byte, 32*1024)
}

然后石窑,內(nèi)部調(diào)用了src.Read(buf)牌芋,并在返回不為EOF的情況下將buf內(nèi)容逐漸寫入dst。加上一些錯誤處理松逊。

Copy方法還有一個兄弟:io.CopyN:
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
最多拷貝n個字節(jié)躺屁。
與CopyN相反,還有一個方法:
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
該方法至少讀取min個字節(jié)直到全部讀完经宏,否則將拋異常犀暑。
這個方法主要用途是保證byte的內(nèi)容被完整的讀取,見ReadFull:

func ReadFull(r Reader, buf []byte) (n int, err error) {
    return ReadAtLeast(r, buf, len(buf))
}

io/ioutil

相比之下io中的偏底層實(shí)現(xiàn)烁兰,ioutil的方法更加實(shí)用耐亏,常用方法有:

func ReadAll(r io.Reader) ([]byte, error)
將reader中的所有內(nèi)容讀取出來,返回字節(jié)數(shù)組沪斟,不需要自己提供字節(jié)數(shù)組

func ReadFile(filename string) ([]byte, error)
將一個文件名傳入广辰,返回內(nèi)容字節(jié)數(shù)組

func WriteFile(filename string, data []byte, perm os.FileMode)error
將data寫入文件,如果文件不存在主之,則以perm的模式創(chuàng)建文件

func ReadDir(dirname string) ([]os.FileInfo, error)
返回目錄下的所有文件信息(個人認(rèn)為這個方法出現(xiàn)得有點(diǎn)奇怪择吊,應(yīng)該在os包更合理)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市槽奕,隨后出現(xiàn)的幾起案子干发,更是在濱河造成了極大的恐慌,老刑警劉巖史翘,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枉长,死亡現(xiàn)場離奇詭異,居然都是意外死亡琼讽,警方通過查閱死者的電腦和手機(jī)必峰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钻蹬,“玉大人吼蚁,你說我怎么就攤上這事。” “怎么了肝匆?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵粒蜈,是天一觀的道長。 經(jīng)常有香客問我旗国,道長枯怖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任能曾,我火速辦了婚禮度硝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寿冕。我一直安慰自己蕊程,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布驼唱。 她就那樣靜靜地躺著藻茂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玫恳。 梳的紋絲不亂的頭發(fā)上辨赐,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音纽窟,去河邊找鬼肖油。 笑死兼吓,一個胖子當(dāng)著我的面吹牛臂港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播视搏,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼审孽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浑娜?” 一聲冷哼從身側(cè)響起佑力,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筋遭,沒想到半個月后打颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漓滔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年编饺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响驴。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡透且,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豁鲤,到底是詐尸還是另有隱情秽誊,我是刑警寧澤鲸沮,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锅论,受9級特大地震影響讼溺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棍厌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一肾胯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耘纱,春花似錦敬肚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至员寇,卻和暖如春弄慰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝶锋。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工陆爽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扳缕。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓慌闭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躯舔。 傳聞我的和親對象是個殘疾皇子驴剔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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