ioパッケージの共通インタフェース速記

4867 ワード

私はC/C++の基础がなくて、インタフェースの概念がなくて、しかもPythonから走ってきて、Pythonの极简主义(1つの结果は往々にして1つの方法しか提供しません)、私をGolangの中でとてもぼんやりさせて、特にファイルの読み書き操作、Goのファイルの読み書き操作は多くの方法があるため、私にどのように选択するか分かりません.インタフェースの概念を学び、パッケージioを見てから徐々に理解し、Golangの柔軟性も好きになりました.私の経験では、インタフェースは重要な知識点であり、一連の操作の規範であり、特に共通インタフェースが特に重要である.例えば、package io
本稿では、最も一般的ないくつかのインタフェースを速記するために、ioインタフェースを系統的に学習したい場合は、下部のリファレンスリンクを読むことをお勧めします.
一、IOインタフェースの概要
package osはI/O原語に対する基本インタフェースを提供し,共有する共通インタフェースとし,これらの共通インタフェースは汎用的な関数を抽象化し,関連する原語の操作を付加している.これらのインタフェースおよび原語は、他の態様の通知が得られない限り、クライアントがそれらが同時実行安全であると仮定すべきではない限り、下位層に対して全く異なる低レベルの動作を実現するパッケージであるからである.
package osで最も重要なのは、ReaderとWriterの2つのインタフェースです.本章で述べた各種インタフェースは,いずれもこの2つのインタフェースに関係している,すなわち,この2つのインタフェースを実現すれば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)バイトをpに読み出し、EOFを含むエラーが発生するとすぐに読み出したバイト数を返し、関数の終了は正常に読み出したバイト数とエラーを返します.Writeは、len(p)バイトのデータをpから最下位のデータストリームに書き込み、書き込みに成功したバイト数とエラーを返します.
  • インタフェース名から容易に推測できるが、一般的に、Goにおけるインタフェースの命名規則:インタフェース名はerで終わる.注意、ここは強引な要求ではありません.erで終わることはありません.標準ライブラリの一部のインタフェースもerで終わるものではありません.

  • 例:
    func wr() {
    	f, _ := os.Create("at.txt")
    	defer f.Close()
    	f.Write([]byte("Go            ")) //     
    	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
    ", 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
    ", p, len(p)) }

    読み取り文字「Go」、長さ2 byte読み取り文字「楽しいプログラミング言語」、長さ50 byte
    三、io.Reader Atと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.リーダールームとosWriterTo
    定義:
    type ReaderFrom interface {
        ReadFrom(r Reader) (n int64, err error)
    }
    
    type WriterTo interface {
        WriteTo(w Writer) (n int64, err error)
    }
    ReadFrom() EOFまたはエラーが発生するまで、rからデータを読み出す.読み出したバイト数とioを返す.EOF以外のエラー.ReadFromはEOFエラーWriteTo()を返してwにデータを書き込み、書き込み可能またはエラーが発生しないまで書き込みません.書き込みのバイト数とエラーを返します.
    例:
    func fromTo() {
    	r := strings.NewReader("Go            ") //     Reader
    	w := bufio.NewWriter(os.Stdout)          //     Writer
    
    	w.ReadFrom(r) // w       r      
    	w.Flush()
    
    	r.Seek(0, os.SEEK_SET) //    
    
    	r.WriteTo(w) // r          w  
    	w.Flush()
    }

    Goは楽しいプログラミング言語ですGoは楽しいプログラミング言語です
    五、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は、入力の1バイトを読み出して返します.読み取り可能なバイトがない場合は、エラーが返されます.ReadRuneは、単一utf-8符号化された文字を読み出し、その文字とそのバイト長を返します.有効な文字がない場合は、エラーが返されます.
    type ByteWriter interface {
        WriteByte(c byte) error
    }

    WriteByteはバイトを書き込み、書き込みに失敗するとエラーが返されます.
    リファレンス
    https://gowalker.org/io https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md