亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

GO語io包的常用接口

 更新時間:2014年12月03日 15:54:24   投稿:shichen2014  
這篇文章主要介紹了GO語io包的常用接口,分析了GO語言接口的概念與功能,并實例列舉了幾個最常用的接口的用法,具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

本文僅僅列舉最常用的幾個接口,如果您想系統的學習 io 接口,建議閱讀底部參考鏈接。

一、IO 接口概述

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

在 package os 中最重要的是兩個接口:Reader 和 Writer 接口。本章所提到的各種接口,都跟這兩個接口有關,也就是說,只要實現了這兩個接口,它就有了 IO 的功能。

小貼士:

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

二、io.Reader 和 io.Writer

定義:

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

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


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

從接口名稱很容易猜到,一般地,Go中接口的命名約定:接口名以er結尾。注意,這里并非強行要求,你完全可以不以 er 結尾。標準庫中有些接口也不是以 er 結尾的。
示例:

復制代碼 代碼如下:
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\", 長度為 %d byte\n", p, len(p))

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


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

三、io.ReaderAt 和 os.WriterAt

定義(off 是 offset 的縮寫):

復制代碼 代碼如下:
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() 一樣。

示例:

復制代碼 代碼如下:
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

定義:

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

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


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

WriteTo() 將數據寫入 w 中,直到沒有數據可寫或發(fā)生錯誤。返回寫入的字節(jié)數和任何錯誤。

示例:

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

 w.ReadFrom(r) // w 一次性讀取 r 的全部內容
 w.Flush()

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

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

五、io.Seeker

定義:

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

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

whence的值,在os包中定義了相應的常量:

復制代碼 代碼如下:
SEEK_SET int = 0 //從文件的起始處開始設置 offset
SEEK_CUR int = 1 //從文件的指針的當前位置處開始設置 offset
SEEK_END int = 2 //從文件的末尾處開始設置 offset

六、io.Closer

定義:

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

用于關閉數據流,釋放資源,不用多廢話了吧。

七、其他

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

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


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

WriteByte寫入一個字節(jié),如果寫入失敗會返回錯誤。

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

希望本文所述對大家的GO語言程序設計有所幫助。

相關文章

  • 使用Golang實現WebSocket心跳機制

    使用Golang實現WebSocket心跳機制

    WebSocket是一種在客戶端和服務器之間實現全雙工通信的協議,它允許實時地傳輸數據,并且比傳統的HTTP請求更加高效,在使用Golang構建WebSocket應用程序時,一個重要的考慮因素是如何實現心跳機制,所以本文將探討如何使用Golang實現WebSocket心跳
    2023-11-11
  • 解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed(推薦)

    解決golang編譯提示dial tcp 172.217.160.113:443: con

    這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問題完美解決,需要的朋友可以參考下
    2023-02-02
  • go build 通過文件名后綴實現不同平臺的條件編譯操作

    go build 通過文件名后綴實現不同平臺的條件編譯操作

    這篇文章主要介紹了go build 通過文件名后綴實現不同平臺的條件編譯操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GO語言協程創(chuàng)建使用并通過channel解決資源競爭

    GO語言協程創(chuàng)建使用并通過channel解決資源競爭

    這篇文章主要為大家介紹了GO語言協程創(chuàng)建使用并通過channel解決資源競爭,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go語言題解LeetCode1275找出井字棋的獲勝者示例

    go語言題解LeetCode1275找出井字棋的獲勝者示例

    這篇文章主要為大家介紹了go語言題解LeetCode1275找出井字棋的獲勝者示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 教你利用Golang可選參數實現可選模式

    教你利用Golang可選參數實現可選模式

    本文討論Golang函數可選參數及函數類型,以及如何利用可選函數類型實現可選模式。同時通過構造函數作為示例,實現強大帶可選參數的構造函數,讓代碼更直觀、靈活、支持擴展
    2023-01-01
  • 300行代碼實現go語言即時通訊聊天室

    300行代碼實現go語言即時通訊聊天室

    本文主要介紹了300行代碼實現go語言即時通訊聊天室,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • go責任鏈行為型設計模式Chain?Of?Responsibility

    go責任鏈行為型設計模式Chain?Of?Responsibility

    這篇文章主要為大家介紹了go行為型設計模式之責任鏈Chain?Of?Responsibility使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • golang中channel+error來做異步錯誤處理有多香

    golang中channel+error來做異步錯誤處理有多香

    官方推薦golang中錯誤處理當做值處理, 既然是值那就可以在channel中傳輸,這篇文章主要介紹了golang 錯誤處理channel+error真的香,需要的朋友可以參考下
    2023-01-01
  • Go標準庫-ServeMux的使用與模式匹配深入探究

    Go標準庫-ServeMux的使用與模式匹配深入探究

    這篇文章主要為大家介紹了Go標準庫-ServeMux的使用與模式匹配深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論