欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Go語言io包中的discard類型

 更新時間:2023年07月14日 10:43:31   作者:陳晨  
這篇文章主要介紹了Go語言io包中的discard類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1. 引言

io.discard是Go語言標準庫提供一個結(jié)構(gòu)體類型,其在丟棄不需要的數(shù)據(jù)場景下非常好用。

本文我們將從io.discard 類型的基本定義出發(fā),講述其基本使用和實現(xiàn)原理,接著簡單描述 io.discard 的使用場景,基于此完成對 io.discard 類型的介紹。

2. 介紹

2.1 基本定義

io.discard 是 Go語言提供的一個Writer,這個Writer 比較特殊,其不會做任何事情。它會將寫入的數(shù)據(jù)立即丟棄,不會做任何處理。其定義如下:

type discard struct{}
func (discard) Write(p []byte) (int, error) {}
func (discard) WriteString(s string) (int, error) {}
func (discard) ReadFrom(r Reader) (n int64, err error) {}

discard 結(jié)構(gòu)體類型沒有定義任何字段,同時還提供了Write ,ReadFromWriteString 方法,Write 方法和WriteString 方法分別接收字節(jié)切片和字符串,然后返回寫入的字節(jié)數(shù)。

同時還實現(xiàn)了io.ReaderFrom 接口,這個是為了在使用 io.Copy 函數(shù)時,將數(shù)據(jù)從源復(fù)制到io.discard 時,避免不必要的操作。

從上面discard 的定義可以看起來,其不是一個公開類型的結(jié)構(gòu)體類型,所以我們并不能創(chuàng)建結(jié)構(gòu)體實例。事實上Go語言提供了一個io.discard 實例的預(yù)定義常量,我們直接使用,無需自己創(chuàng)建實例,定義如下:

var Discard Writer = discard{}

2.2 使用說明

下面通過一個丟棄網(wǎng)絡(luò)連接中不再需要的數(shù)據(jù)的例子,來展示io.Discard 的使用,代碼示例如下:

package main
import (
        "fmt"
        "io"
        "net"
        "os"
)
func discardData(conn net.Conn, bytesToDiscard int64) error {
        _, err := io.CopyN(io.Discard, conn, bytesToDiscard)
        return err
}
func main() {
        conn, err := net.Dial("tcp", "example.com:80")
        if err != nil {
                fmt.Println("連接錯誤:", err)
                return
        }
        defer conn.Close()
        bytesToDiscard := int64(1024) // 要丟棄的字節(jié)數(shù)
        err = discardData(conn, bytesToDiscard)
        if err != nil {
                fmt.Println("丟棄數(shù)據(jù)錯誤:", err)
                return
        }
        fmt.Println("數(shù)據(jù)已成功丟棄。")
}

在上面示例中,我們建立了網(wǎng)絡(luò)連接,然后連接中的前1024個字節(jié)的數(shù)據(jù)是不需要的。這個時候,我們通過io.CopyN 函數(shù)將數(shù)據(jù)從conn 拷貝到io.Discard 當(dāng)中,基于io.Discard 丟棄數(shù)據(jù)的特性,成功將連接的前1024個字節(jié)丟棄掉,而不需要自定義緩沖區(qū)之類的操作,簡單高效。

3. 實現(xiàn)原理

io.Discard的目的是在某些場景下提供一個滿足io.Writer接口的實例,但用戶對于數(shù)據(jù)的寫入操作并不關(guān)心。它可以被用作一個黑洞般的寫入目標,默默地丟棄所有寫入它的數(shù)據(jù)。所以io.discard 的實現(xiàn)也相對比較簡單,不對輸入的數(shù)據(jù)進行任何處理即可,下面我們來看具體的實現(xiàn)。

首先是io.discard 結(jié)構(gòu)體的定義,沒有定義任何字段,因為本來也不需要執(zhí)行任何寫入操作:

type discard struct{}

而對于Write 和 WriteString 方法,其直接返回了傳入?yún)?shù)的長度,往該Writer 寫入的數(shù)據(jù)不會被寫入到其他地方,而是被直接丟棄:

func (discard) Write(p []byte) (int, error) {
   return len(p), nil
}
func (discard) WriteString(s string) (int, error) {
   return len(s), nil
}

同時discard 也實現(xiàn)了io.ReaderFrom 接口,實現(xiàn)了ReadFrom 方法,實現(xiàn)也是非常簡單,從blackHolePool 緩沖池中獲取字節(jié)切片,然后不斷讀取數(shù)據(jù),讀取完成之后,再將字節(jié)切片重新放入緩沖池當(dāng)中:

// 存在一個字節(jié)切片緩沖池
var blackHolePool = sync.Pool{
   New: func() any {
      b := make([]byte, 8192)
      return &b
   },
}
func (discard) ReadFrom(r Reader) (n int64, err error) {
   // 從緩沖池中取出一個 字節(jié)切片
   bufp := blackHolePool.Get().(*[]byte)
   readSize := 0
   for {
      // 不斷讀取數(shù)據(jù),bufp 只是作為一個讀取數(shù)據(jù)的中介,讀取到的數(shù)據(jù)并無意義
      readSize, err = r.Read(*bufp)
      n += int64(readSize)
      if err != nil {
         // 將字節(jié)切片 重新放入到 blackHolePool 當(dāng)中
         blackHolePool.Put(bufp)
         if err == EOF {
            return n, nil
         }
         return
      }
   }
}

io.Copy 函數(shù)中,將調(diào)用discard 中的ReadFrom 方法,能夠?qū)?code>Writer中的所有數(shù)據(jù)讀取完,然后丟棄掉。

4. 使用場景

io.Discard 給我們提供了一個io.Writer 接口的實例,同時其又不會真實得寫入數(shù)據(jù),這個在某些場景下非常有用。

有時候,我們可能需要一個實現(xiàn)io.Writer 接口的實例,但是我們并不關(guān)心數(shù)據(jù)寫入Writer 的結(jié)果,也不關(guān)心數(shù)據(jù)是否寫到了哪個地方,此時io.Discard 就給我們提供了一個方便的解決方案。同時io.Discard 可以作為一個黑洞寫入目標,能夠?qū)?shù)據(jù)默默丟棄掉,不會進行實際的處理和存儲。

所以如果我們想要丟棄某些數(shù)據(jù),亦或者是需要一個io.Writer接口的實例,但是對于寫入結(jié)果不需要關(guān)注時,此時使用io.Discard 是非常合適的。

5. 總結(jié)

io.discard 函數(shù)是Go語言標準庫中一個實現(xiàn)了Writer接口的結(jié)構(gòu)體類型,能夠悄無聲息得實現(xiàn)數(shù)據(jù)的丟棄。 我們先從io.discard 類型的基本定義出發(fā),之后通過一個簡單的示例,展示如何使用io.discard 類型實現(xiàn)對不需要數(shù)據(jù)的丟棄。

接著我們講述了io.discard 類型的實現(xiàn)原理,其實就是不對寫入的數(shù)據(jù)執(zhí)行任何操作。在使用場景下,我們想要丟棄某些數(shù)據(jù),亦或者是需要一個io.Writer接口的實例,但是對于寫入結(jié)果不需要關(guān)注時,此時使用io.Discard 是非常合適的。

基于此,便完成了對io.discard 類型的介紹,希望對你有所幫助。

以上就是一文詳解Go語言io包中的discard類型的詳細內(nèi)容,更多關(guān)于Go語言io包discard類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Go語言解析動態(tài)JSON格式的方法

    使用Go語言解析動態(tài)JSON格式的方法

    本篇文章主要介紹了使用Go語言解析動態(tài)JSON格式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • GO語言基礎(chǔ)庫os包的函數(shù)全面解析

    GO語言基礎(chǔ)庫os包的函數(shù)全面解析

    這篇文章主要為大家介紹了GO語言基礎(chǔ)庫os包的函數(shù)全面解析, 有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語言中,Goroutine是一種輕量級線程,它的退出機制對于并發(fā)編程至關(guān)重要,下午就來介紹幾種Goroutine的退出機制,希望對大家有所幫助
    2023-06-06
  • 在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用的架構(gòu)中,分布式系統(tǒng)已經(jīng)成為主流,分布式系統(tǒng)的優(yōu)勢在于能夠提供高可用性、高并發(fā)性和可擴展性,本文將介紹鏈路追蹤的概念和原理,并重點介紹如何在Golang中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng),需要的朋友可以參考下
    2023-10-10
  • 詳解如何在Go語言中生成隨機種子

    詳解如何在Go語言中生成隨機種子

    這篇文章主要為大家詳細介紹了如何在Go語言中生成隨機種子,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-04-04
  • 深入剖析Go語言中的Select語句

    深入剖析Go語言中的Select語句

    select是Go中的一個控制結(jié)構(gòu),類似于switch語句,本文主要介紹了深入剖析Go語言中的Select語句,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go語言團隊的一個核心目標是保持語言的簡單性,他們認為,如果一個功能可以用簡單的組合來實現(xiàn),那就沒有必要把它放進標準庫里,本文給大家介紹Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • goquery 入門(安裝使用教程)

    goquery 入門(安裝使用教程)

    這篇文章主要為大家介紹了goquery 入門(安裝使用)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Golang 獲取系統(tǒng)信息的實現(xiàn)

    Golang 獲取系統(tǒng)信息的實現(xiàn)

    本文主要介紹了Golang 獲取系統(tǒng)信息的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 提升Golang應(yīng)用性能:深入理解Context的應(yīng)用

    提升Golang應(yīng)用性能:深入理解Context的應(yīng)用

    本文將深入探討如何通過深入理解和正確應(yīng)用Go語言中的Context來提升應(yīng)用性能。需要的朋友可以參考下
    2023-09-09

最新評論