主頁 > 知識(shí)庫(kù) > GO語io包的常用接口

GO語io包的常用接口

熱門標(biāo)簽:滁州自建外呼系統(tǒng) 經(jīng)常接到推銷電話機(jī)器人的電話 海外照相館地圖標(biāo)注入駐 智能營(yíng)銷軟件 客服級(jí)電銷機(jī)器人 旅游廁所如何電子地圖標(biāo)注 工商信用卡外呼系統(tǒng)教程 外呼系統(tǒng)多少錢一年 外呼系統(tǒng)如何接收服務(wù)密碼

本文實(shí)例分析了GO語io包的常用接口。分享給大家供大家參考。具體分析如下:

我沒有 C/C++ 基礎(chǔ),沒有接口的概念,且從 Python 投奔而來,Python 的極簡(jiǎn)主義(一個(gè)結(jié)果往往只提供一個(gè)方法),讓我在 Golang 中非常迷糊,特別是文件的讀寫操作,因?yàn)?Go 的文件讀寫操作有很多的方法,讓我不知道怎么選擇。直到我學(xué)習(xí)了 interface 的概念,然后由看了 package io 后才慢慢理解,也漸漸的喜歡上了 Golang 的靈活性。以我的經(jīng)驗(yàn)來說,接口是一個(gè)很重要的知識(shí)點(diǎn),是一系列操作的規(guī)范,特別是公共接口尤為重要,如:package io

本文僅僅列舉最常用的幾個(gè)接口,如果您想系統(tǒng)的學(xué)習(xí) io 接口,建議閱讀底部參考鏈接。

一、IO 接口概述

package os 提供了對(duì) I/O 原語的基本接口,使之成為共享的公共接口,這些公共接口抽象出了泛用的函數(shù)并附加了一些相關(guān)的原語的操作。因?yàn)檫@些接口和原語是對(duì)底層實(shí)現(xiàn)完全不同的低水平操作的包裝,除非得到其它方面的通知,客戶端不應(yīng)假設(shè)它們是并發(fā)執(zhí)行安全的。

在 package os 中最重要的是兩個(gè)接口:Reader 和 Writer 接口。本章所提到的各種接口,都跟這兩個(gè)接口有關(guān),也就是說,只要實(shí)現(xiàn)了這兩個(gè)接口,它就有了 IO 的功能。

小貼士:

var EOF = errors.New("EOF"): 在 package io中定義,使用非常頻繁。正常情況下當(dāng) Read() 無法得到更多返回時(shí)就返回 EOF,即文件到達(dá)了結(jié)尾(end-of-file)。

二、io.Reader 和 io.Writer

定義:

復(fù)制代碼 代碼如下:
type Reader interface {
    Read(p []byte) (n int, err error)
}

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


Read 將 len(p) 個(gè)字節(jié)讀取到 p 中,當(dāng)遇到任何錯(cuò)誤(包括EOF)會(huì)立即返回已讀取的字節(jié)數(shù),函數(shù)結(jié)束會(huì)返回成功讀取的字節(jié)數(shù)和任何錯(cuò)誤。
Write 將 len(p) 字節(jié)數(shù)據(jù)從 p 寫入底層的數(shù)據(jù)流,然后返回成功寫入的字節(jié)數(shù)和任何錯(cuò)誤。

從接口名稱很容易猜到,一般地,Go中接口的命名約定:接口名以er結(jié)尾。注意,這里并非強(qiáng)行要求,你完全可以不以 er 結(jié)尾。標(biāo)準(zhǔn)庫(kù)中有些接口也不是以 er 結(jié)尾的。
示例:

復(fù)制代碼 代碼如下:
func wr() {
 f, _ := os.Create("at.txt")
 defer f.Close()
 f.Write([]byte("Go是一種令人愉悅的編程語言")) //寫入字節(jié)流
 f.Seek(0, os.SEEK_SET)            //將指針重置

 p := make([]byte, 2) // 讀取 2 byte( len(buf)=2 )
 if _, err := f.Read(p); err != nil {
  log.Fatal("[F]", err)
 }
 fmt.Printf("讀取字符 \"%s\", 長(zhǎng)度為 %d byte\n", p, len(p))

 p = make([]byte, 50)
 if _, err := f.Read(p); err != nil {
  if err != io.EOF { //忽略 EOF 錯(cuò)誤
   log.Fatal("[F]", err)
  }
 }
 fmt.Printf("讀取字符 \"%s\", 長(zhǎng)度為 %d byte\n", p, len(p))
}


讀取字符 "Go", 長(zhǎng)度為 2 byte
讀取字符 "是一種令人愉悅的編程語言              ", 長(zhǎng)度為 50 byte

三、io.ReaderAt 和 os.WriterAt

定義(off 是 offset 的縮寫):

復(fù)制代碼 代碼如下:
type ReaderAt interface {
    ReadAt(p []byte, off int64) (n int, err error)
}

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


ReadAt() 從基本輸入源的偏移量 off 處開始,其他和 Read() 一樣;
WriteAt() 從基本輸入源的偏移量 off 處開始,其他和 Write() 一樣。

示例:

復(fù)制代碼 代碼如下:
func at() {
 f, _ := os.Create("at.txt")
 defer f.Close()

 f.WriteString("Go是一種令人愉悅的編程語言")
 f.WriteAt([]byte("程序"), 26) //偏移 26byte 改寫“編程”->“程序”

 fi, _ := f.Stat()              //獲取文件信息
 p := make([]byte, fi.Size()-2) //文件大小減去偏移值
 f.ReadAt(p, 2)                 //偏移 2 byte

 os.Stdout.Write(p)
}

四、io.ReaderFrom 和 os.WriterTo

定義:

復(fù)制代碼 代碼如下:
type ReaderFrom interface {
    ReadFrom(r Reader) (n int64, err error)
}

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


ReadFrom() 從 r 中讀取數(shù)據(jù),直到 EOF 或發(fā)生錯(cuò)誤。返回讀取的字節(jié)數(shù)和 io.EOF 之外的其他錯(cuò)誤。ReadFrom不會(huì)返回EOF錯(cuò)誤

WriteTo() 將數(shù)據(jù)寫入 w 中,直到?jīng)]有數(shù)據(jù)可寫或發(fā)生錯(cuò)誤。返回寫入的字節(jié)數(shù)和任何錯(cuò)誤。

示例:

復(fù)制代碼 代碼如下:
func fromTo() {
 r := strings.NewReader("Go是一種令人愉悅的編程語言") //創(chuàng)建一個(gè) Reader
 w := bufio.NewWriter(os.Stdout)          //創(chuàng)建一個(gè) Writer

 w.ReadFrom(r) // w 一次性讀取 r 的全部?jī)?nèi)容
 w.Flush()

 r.Seek(0, os.SEEK_SET) //重置指針

 r.WriteTo(w) // r 一次性將內(nèi)容寫入 w 中
 w.Flush()
}

五、io.Seeker

定義:

復(fù)制代碼 代碼如下:
type Seeker interface {
    Seek(offset int64, whence int) (ret int64, err error)
}

Seek 設(shè)置下一次 Read 或 Write 的偏移量(offset),它的解釋取決于 whence。示例見上文。

whence的值,在os包中定義了相應(yīng)的常量:

復(fù)制代碼 代碼如下:
SEEK_SET int = 0 //從文件的起始處開始設(shè)置 offset
SEEK_CUR int = 1 //從文件的指針的當(dāng)前位置處開始設(shè)置 offset
SEEK_END int = 2 //從文件的末尾處開始設(shè)置 offset

六、io.Closer

定義:

復(fù)制代碼 代碼如下:
type Closer interface {
    Close() error
}

用于關(guān)閉數(shù)據(jù)流,釋放資源,不用多廢話了吧。

七、其他

復(fù)制代碼 代碼如下:
type ByteReader interface {
 ReadByte() (c byte, err error)
}

type RuneReader interface {
    ReadRune() (r rune, size int, err error)
}


ReadByte讀取輸入中的單個(gè)字節(jié)并返回。如果沒有字節(jié)可讀取,會(huì)返回錯(cuò)誤。
ReadRune讀取單個(gè)utf-8編碼的字符,返回該字符和它的字節(jié)長(zhǎng)度。如果沒有有效的字符,會(huì)返回錯(cuò)誤。
復(fù)制代碼 代碼如下:
type ByteWriter interface {
    WriteByte(c byte) error
}

WriteByte寫入一個(gè)字節(jié),如果寫入失敗會(huì)返回錯(cuò)誤。

參考:
https://gowalker.org/io
https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md

希望本文所述對(duì)大家的GO語言程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • Go語言的os包中常用函數(shù)初步歸納
  • 舉例講解Go語言中函數(shù)的閉包使用
  • 深入理解Go語言中的閉包
  • go語言里包的用法實(shí)例
  • Go語言聲明一個(gè)多行字符串的變量
  • Go語言基礎(chǔ)知識(shí)總結(jié)(語法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等)
  • GO語言獲取系統(tǒng)環(huán)境變量的方法
  • Go語言中的變量聲明和賦值
  • 詳解Golang編程中的常量與變量
  • go語言學(xué)習(xí)之包和變量詳解

標(biāo)簽:本溪 運(yùn)城 深圳 湘潭 喀什 九江 楚雄 晉城

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《GO語io包的常用接口》,本文關(guān)鍵詞  語,包,的,常用,接口,語,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《GO語io包的常用接口》相關(guān)的同類信息!
  • 本頁收集關(guān)于GO語io包的常用接口的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章