<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一文了解io包中的discard類型

      1. 引言

      io.discard是Go語言標準庫提供一個結構體類型,其在丟棄不需要的數據場景下非常好用。本文我們將從io.discard 類型的基本定義出發,講述其基本使用和實現原理,接著簡單描述 io.discard 的使用場景,基于此完成對 io.discard 類型的介紹。

      2. 介紹

      2.1 基本定義

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

      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 結構體類型沒有定義任何字段,同時還提供了Write ,ReadFromWriteString 方法,Write 方法和WriteString 方法分別接收字節切片和字符串,然后返回寫入的字節數。

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

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

      var Discard Writer = discard{}
      

      2.2 使用說明

      下面通過一個丟棄網絡連接中不再需要的數據的例子,來展示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) // 要丟棄的字節數
      
              err = discardData(conn, bytesToDiscard)
              if err != nil {
                      fmt.Println("丟棄數據錯誤:", err)
                      return
              }
      
              fmt.Println("數據已成功丟棄。")
      }
      

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

      3. 實現原理

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

      首先是io.discard 結構體的定義,沒有定義任何字段,因為本來也不需要執行任何寫入操作:

      type discard struct{}
      

      而對于WriteWriteString 方法,其直接返回了傳入參數的長度,往該Writer 寫入的數據不會被寫入到其他地方,而是被直接丟棄:

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

      同時discard 也實現了io.ReaderFrom 接口,實現了ReadFrom 方法,實現也是非常簡單,從blackHolePool 緩沖池中獲取字節切片,然后不斷讀取數據,讀取完成之后,再將字節切片重新放入緩沖池當中:

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

      io.Copy 函數中,將調用discard 中的ReadFrom 方法,能夠將Writer中的所有數據讀取完,然后丟棄掉。

      4. 使用場景

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

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

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

      5. 總結

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

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

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

      posted @ 2023-07-13 06:37  菜鳥額  閱讀(737)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 在线精品国产中文字幕| 亚洲无人区一码二码三码| 男女动态无遮挡动态图| 伊人精品成人久久综合97| 999福利激情视频| 国产精品一二三区蜜臀av| 亚洲AV色香蕉一区二区蜜桃小说| 亚洲国产另类久久久精品小说 | 人人妻人人澡人人爽人人精品电影| 欧美亚洲一区二区三区在线| 亚洲熟妇在线视频观看| 国产剧情福利一区二区麻豆| 黑人av无码一区| 欧美老少配性行为| 国产成人亚洲精品日韩激情| 欧美一区二区三区欧美日韩亚洲| 久久99九九精品久久久久蜜桃| 亚洲一区二区三午夜福利| 大地资源网第二页免费观看| 日韩av综合免费在线| 亚洲欧洲日产国产 最新| 国产精品一区二区三区日韩| 国产亚洲精品午夜福利| 日韩av熟女人妻一区二| 国产成人一区二区三区在线| 亚洲av片在线免费观看| 国产午夜精品亚洲精品国产| 一区二区丝袜美腿视频| 天堂亚洲免费视频| 福利成人午夜国产一区| 国产精品欧美福利久久| 平江县| 无套内谢少妇高清毛片| 娇妻玩4p被三个男人伺候| 日韩在线视频网| 国产精品大片中文字幕| 国产浮力第一页草草影院| 亚洲熟妇自偷自拍另欧美| 亚洲香蕉网久久综合影视| 黑山县| 久久夜色撩人精品国产av|