最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 引言

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

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

2. 介紹

2.1 基本定義

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

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

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

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

var Discard Writer = discard{}

2.2 使用說明

下面通過一個(gè)丟棄網(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("連接錯(cuò)誤:", err)
                return
        }
        defer conn.Close()
        bytesToDiscard := int64(1024) // 要丟棄的字節(jié)數(shù)
        err = discardData(conn, bytesToDiscard)
        if err != nil {
                fmt.Println("丟棄數(shù)據(jù)錯(cuò)誤:", err)
                return
        }
        fmt.Println("數(shù)據(jù)已成功丟棄。")
}

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

3. 實(shí)現(xiàn)原理

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

首先是io.discard 結(jié)構(gòu)體的定義,沒有定義任何字段,因?yàn)楸緛硪膊恍枰獔?zhí)行任何寫入操作:

type discard struct{}

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

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

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

// 存在一個(gè)字節(jié)切片緩沖池
var blackHolePool = sync.Pool{
   New: func() any {
      b := make([]byte, 8192)
      return &b
   },
}
func (discard) ReadFrom(r Reader) (n int64, err error) {
   // 從緩沖池中取出一個(gè) 字節(jié)切片
   bufp := blackHolePool.Get().(*[]byte)
   readSize := 0
   for {
      // 不斷讀取數(shù)據(jù),bufp 只是作為一個(gè)讀取數(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. 使用場(chǎng)景

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

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

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

5. 總結(jié)

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

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

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

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

相關(guān)文章

  • 深入分析golang多值返回以及閉包的實(shí)現(xiàn)

    深入分析golang多值返回以及閉包的實(shí)現(xiàn)

    相對(duì)于C/C++,golang有很多新穎的特性,例如goroutine,channel等等,這些特性其實(shí)從golang源碼是可以理解其實(shí)現(xiàn)的原理。今天這篇文章主要來分析下golang多值返回以及閉包的實(shí)現(xiàn),因?yàn)檫@兩個(gè)實(shí)現(xiàn)golang源碼中并不存在,我們必須從匯編的角度來窺探二者的實(shí)現(xiàn)。
    2016-09-09
  • go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • VScode下配置Go語言開發(fā)環(huán)境(2023最新)

    VScode下配置Go語言開發(fā)環(huán)境(2023最新)

    在VSCode中配置Golang開發(fā)環(huán)境是非常簡(jiǎn)單的,本文主要記錄了Go的安裝,以及給vscode配置Go的環(huán)境,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼

    golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼

    本文主要介紹了golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Goland debug失效詳細(xì)解決步驟(合集)

    Goland debug失效詳細(xì)解決步驟(合集)

    今天用Goland開發(fā)時(shí),打斷點(diǎn),以debug方式運(yùn)行,發(fā)現(xiàn)程序并沒有斷住,程序跳過了斷點(diǎn),直接運(yùn)行結(jié)束,網(wǎng)上搜尋了大量文章,最后得以解決,特此在這里總結(jié)幾種Goland debug失效常見情況,需要的朋友可以參考下
    2025-02-02
  • Go語言編程通過dwarf獲取內(nèi)聯(lián)函數(shù)

    Go語言編程通過dwarf獲取內(nèi)聯(lián)函數(shù)

    這篇文章主要為大家介紹了Go語言編程通過dwarf獲取內(nèi)聯(lián)函數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go設(shè)計(jì)模式之單例模式講解和代碼示例

    Go設(shè)計(jì)模式之單例模式講解和代碼示例

    單例是一種創(chuàng)建型設(shè)計(jì)模式,讓你能夠保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問該實(shí)例的全局節(jié)點(diǎn),本文就通過代碼示例給大家講講Go單例模式,需要的朋友可以參考下
    2023-07-07
  • 一文帶你深入理解Golang中的RWMutex

    一文帶你深入理解Golang中的RWMutex

    這篇文章主要為大家詳細(xì)介紹了Golang中RWMutex的相關(guān)知識(shí),知其然,更要知其所以然。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • Golang實(shí)現(xiàn)驗(yàn)證一個(gè)字符串是否為URL

    Golang實(shí)現(xiàn)驗(yàn)證一個(gè)字符串是否為URL

    在實(shí)際開發(fā)過程中,有時(shí)候會(huì)遇到?URL?的校驗(yàn)問題,Go?語言中有哪些方法去驗(yàn)證一個(gè)字符串是否滿足?URL?格式呢?本文就來和大家詳細(xì)講講
    2023-04-04
  • 使用Golang生成壓縮文件的詳細(xì)教程

    使用Golang生成壓縮文件的詳細(xì)教程

    與其他語言一樣,內(nèi)置標(biāo)準(zhǔn)庫默認(rèn)支持文件壓縮功能,本文介紹Golang如何創(chuàng)建壓縮文件,增加一個(gè)或多個(gè)文件生成壓縮文件,也可以在壓縮文件中創(chuàng)建文件夾,用于對(duì)文件進(jìn)行分類管理,Golang標(biāo)準(zhǔn)庫 archive/zip提供了創(chuàng)建和讀取壓縮文件功能,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

乌兰浩特市| 济阳县| 英山县| 河西区| 龙州县| 宾川县| 鹤山市| 阆中市| 鄂州市| 红河县| 沁水县| 班戈县| 谢通门县| 凌海市| 通州区| 始兴县| 玛纳斯县| 库车县| 穆棱市| 临湘市| 古蔺县| 葫芦岛市| 丰顺县| 崇文区| 盘锦市| 罗山县| 任丘市| 伊金霍洛旗| 彰化县| 海盐县| 双城市| 普宁市| 黔西| 天峨县| 建昌县| 类乌齐县| 齐河县| 晋州市| 江安县| 宜兴市| 桂阳县|