Go語言程式:建立名為Reader的介面,定義Read方法


在這篇關於Go語言的文章中,我們將建立一個名為Reader的介面,使用直接介面實現和介面組合來定義read方法,並透過示例來闡述這個概念。Go語言中的read方法用於從源讀取資料。

語法

sw.data

它表示訪問結構體的資料。

  • sw − 它表示一個變數,可以是使用者定義的結構體變數或指向結構體的指標。

  • data − 它是您要訪問的欄位的名稱。

copy(p, sw.data[sw.pos:])

用於將資料從一個切片複製到另一個切片。

  • copy − 用於將元素從源切片複製到目標切片。

  • p − 它表示目標切片。

  • data, pos − 這些是結構體的欄位。

string.newReader()

此函式用於使用函式從字串中讀取資料。

演算法

  • 宣告一個帶有Read方法的Reader介面。

  • 透過建立具有自身Read方法實現的型別來實現Reader介面。

  • 編寫一個操作Reader物件的函式,利用Read方法。

  • 建立實現型別的例項並將它們分配給Reader型別的變數。

  • 使用不同的Reader物件呼叫該函式以確保功能正常。

  • 透過執行程式並驗證Read方法是否被正確呼叫來測試程式。

  • 透過新增實現該介面的新型別並確保相容性而不修改現有程式碼來驗證Reader介面的靈活性。

示例1

在此程式碼示例中,我們首先定義了帶有Read方法的Reader介面。

接下來,我們為名為StringWriter的型別實現了Read方法,這是一個實現Reader介面的自定義型別。Read方法從StringWriter的data欄位讀取位元組並將它們複製到提供的位元組切片中。

package main

import (
   "fmt"
   "io"
   "strings"
)

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

type StringWriter struct {
   data string
   pos  int
}

func (sw *StringWriter) Read(p []byte) (n int, err error) {
   if sw.pos >= len(sw.data) {
      return 0, io.EOF
   }

   n = copy(p, sw.data[sw.pos:])
   sw.pos += n
   return n, nil
}

func main() {
   stringWriter := StringWriter{data: "Hello, World!"}
   
   buffer := make([]byte, 5)

   n, err := stringWriter.Read(buffer)
   if err != nil {
      fmt.Println("Error:", err)
   } else {
      fmt.Println("Bytes Read:", n)
      fmt.Println("Content:", string(buffer[:n]))
   }

   reader := strings.NewReader("Hello, Gophers!")
   n, err = reader.Read(buffer)
   if err != nil {
      fmt.Println("Error:", err)
   } else {
      fmt.Println("Bytes Read:", n)
      fmt.Println("Content:", string(buffer[:n]))
   }
}

輸出

Bytes Read: 5
Content: Hello
Bytes Read: 5
Content: Hello

示例2

在此程式碼示例中,我們首先定義了帶有Read方法的Reader介面和帶有Close方法的Closer介面。然後,我們建立了一個名為ReadCloser的新介面,它嵌入了Reader和Closer介面。我們為名為FileReader的型別實現了Read和Close方法,該型別表示檔案讀取器。Read方法將位元組讀取到提供的位元組切片中,而Close方法關閉FileReader使用的任何資源。

package main

import "fmt"

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

type Closer interface {
   Close() error
}

type ReadCloser interface {
   Reader
   Closer
}

type FileReader struct {
}

func (fr FileReader) Read(p []byte) (n int, err error) {
   return 0, nil
}

func (fr FileReader) Close() error {
   return nil
}

func main() {
   fileReader := FileReader{}

   var rc ReadCloser = fileReader

   buffer := make([]byte, 1024)
   n, err := rc.Read(buffer)
   fmt.Println("Bytes Read:", n, "Error:", err)
   err = rc.Close()
   fmt.Println("Close Error:", err)
}

輸出

Bytes Read: 0 Error: <nil>
Close Error: <nil>

結論

在本文中,我們研究瞭如何建立一個名為“Reader”的介面以及一個“Reader”。透過定義一個連結並將其與不同的模型一起使用,我們允許不同的物件可以互換使用,從而提供多型行為。Reader介面提供了一個契約,保證任何使用它的人都將擁有一個“Read”方法。這種靈活性使我們能夠編寫更模組化和可擴充套件的程式碼。

更新於: 2023年7月20日

187 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.