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

Go中Writer和Reader接口的使用入門

 更新時(shí)間:2022年04月20日 10:30:59   作者:宇宙之一粟  
本文主要介紹了Go中Writer和Reader接口的使用入門,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

引言

我們學(xué)習(xí)其他語言編程時(shí),會(huì)學(xué)到一個(gè) io 包,這個(gè)包可以以流的方式高效處理數(shù)據(jù),而不用考慮數(shù)據(jù)是什么,數(shù)據(jù)來自哪里,以及數(shù)據(jù)要發(fā)送到哪里的問題。

io 是一個(gè) Golang 標(biāo)準(zhǔn)庫(kù)包,它為圍繞輸入和輸出的許多操作和用例定義了靈活的接口。

io 包參見:golang.org/pkg/io/

與 stdout 和 stdin 對(duì)應(yīng),Go 語言實(shí)現(xiàn)了 io.Writerio.Reader 兩個(gè)接口。通過實(shí)現(xiàn)這兩個(gè)接口,其他接口都可以使用 io 包提供的所有功能,也可以用于其他包里接收著兩個(gè)接口的函數(shù)以及方法。

Go 還提供了名為 bufioioutil 的包,其中包含與使用這些接口相關(guān)的有用功能。

Writer 接口

io.Writer 接口是 Go 非常小的接口之一。它只有一種方法。寫入方法。 Go 標(biāo)準(zhǔn)庫(kù)中的許多包都使用 io.Writer 接口,它表示將字節(jié)切片寫入數(shù)據(jù)流的能力。更一般地,允許您將數(shù)據(jù)寫入實(shí)現(xiàn) io.Writer 接口的東西。io.Writer 接口的聲明如下:

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

這個(gè)接口聲明了唯一一個(gè)方法 Writer,這個(gè)方法接收一個(gè) byte 切片,并返回一個(gè)寫入的字節(jié)數(shù) n 和 error 錯(cuò)誤值。

這里會(huì)有兩個(gè)點(diǎn)需要注意:

  • Writer 從 p 字節(jié)切片的數(shù)據(jù)流寫入 len(p) 字節(jié)的數(shù)據(jù)。這個(gè)方法返回從 p 里寫出的字節(jié)數(shù)(0 <= n <= len(p) ),以及任何可能導(dǎo)致寫入提起結(jié)束的錯(cuò)誤。
  • Writer 在返回 n < len(p) 的時(shí)候,必須返回某個(gè) nil 值的 error。Writer 絕不能改寫切片里的數(shù)據(jù),也不能臨時(shí)修改。

現(xiàn)在來看一個(gè)例子,看在 Go 中將數(shù)據(jù)寫入文件時(shí)如何使用 io.Writer

package main

import (
	"fmt"
	"os"
)

func main() {

	f, err := os.OpenFile("hello.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	n, err := f.Write([]byte("Hello, My name is LeeLei!"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("wrote %d bytes", n)
}

運(yùn)行結(jié)果:wrote 25 bytes, 同時(shí)我們可以查看 hello.txt 文件內(nèi)容:

os.File 的 Read 確實(shí)是同一個(gè) io.Writer 接口的實(shí)現(xiàn),用于將字節(jié)切片寫入底層文件的數(shù)據(jù)流。這是 os.File.Write 的定義:

func (f *File) Write(b []byte) (n int, err error)

Reader 接口

然后來看一下 Reader 接口的聲明:

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

Reader 是一個(gè)帶有強(qiáng)抽象的小接口!那個(gè)抽象到底是什么? Read 方法的想法是它表示從某個(gè)源讀取數(shù)據(jù)字節(jié),以便我們可以在代碼中使用這些字節(jié)。該來源可能是文件、相機(jī)、網(wǎng)絡(luò)連接,或者只是一個(gè)普通的舊字符串。例如,如果我們從文件中讀取數(shù)據(jù),我們將使用的 io.Reader*os.File。

io.Reader 接口聲明了一個(gè)方法 Read,這個(gè)方法同樣接受一個(gè) byte 切片,返回兩個(gè)值。第一個(gè)值是讀入的字節(jié)數(shù),第二個(gè)值是 error 錯(cuò)誤值。

  • p []byte 是我們傳遞給 Read 方法的字節(jié)切片。 Reader 將從其數(shù)據(jù)源(如文件)讀取的數(shù)據(jù)復(fù)制到該字節(jié)片。
  • 返回的 n int 告訴我們?cè)谶@個(gè) Read 調(diào)用中讀取了多少字節(jié)。
  • 返回的 err error 是讀取數(shù)據(jù)時(shí)可能發(fā)生的任何錯(cuò)誤,例如到達(dá)文件末尾。

讓我們用一個(gè)文件來嘗試一下,看看我們是如何使用它的。復(fù)制此文本并將其保存到名為 hello.txt 的新目錄中的文件中:

Hello, My name is LeeLei!

現(xiàn)在,讓我們編寫一些 Go 代碼來使用 File 的 Read 方法讀取它。復(fù)制此代碼并將其保存到與 hello.txt 位于同一目錄中的文件 main.go 中:

package main

import (
	"log"
	"os"
)

func main() {
	file, err := os.OpenFile("hello.txt", os.O_RDWR|os.O_CREATE|os.O_RDONLY, 0600)
	if err != nil {
		log.Fatalf("error opening hello.txt: %v", err)
	}
	defer file.Close()

	// Make a byte slice that's big enough to store a few words of the message
	// we're reading
	bytesRead := make([]byte, 33)

	// Now read some data, passing in our byte slice
	n, err := file.Read(bytesRead)
	if err != nil {
		log.Fatalf("error reading from hello.txt: %v", err)
	}

	// Take a look at the bytes we copied into the byte slice
	log.Printf("We read \"%s\" into bytesRead (%d bytes)",
		string(bytesRead), n)
}

運(yùn)行該代碼:go run main.go,然后可以看到如下輸出:

$ go run main.go     
2022/04/18 22:56:29 We read "Hello, My name is LeeLei!" into bytesRead (25 bytes)

那么當(dāng)我們調(diào)用 os.File.Read 時(shí),Go 會(huì)從文件中讀取數(shù)據(jù),并將其復(fù)制到 bytesRead 中,由于沒有發(fā)生錯(cuò)誤,因此返回的錯(cuò)誤為 nil。我們將 bytesRead 切片傳遞給 Read 函數(shù),就像我們將杯子傳遞給汽水噴泉一樣!

總結(jié)

本篇文章簡(jiǎn)單介紹了 Go 語言 io 包中的兩個(gè)很實(shí)用的接口:Writer 和 Reader,分別給出了這兩個(gè)接口的聲明和解釋,然后以一個(gè)簡(jiǎn)單的例子在代碼中使用這兩個(gè)小巧的接口,但是 Go 語言設(shè)計(jì)這兩個(gè)接口的用法遠(yuǎn)遠(yuǎn)不止這些,也需要我們不斷去探索其他功能,甚至學(xué)有余力去理解 Go 這樣的設(shè)計(jì)的原理。

到此這篇關(guān)于Go中Writer和Reader接口的使用入門的文章就介紹到這了,更多相關(guān)Go Writer和Reader接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用dep 配置golang 開發(fā)環(huán)境的操作方法

    使用dep 配置golang 開發(fā)環(huán)境的操作方法

    下面小編就為大家?guī)硪黄褂胐ep 配置golang 開發(fā)環(huán)境的操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • go語言題解LeetCode228匯總區(qū)間示例詳解

    go語言題解LeetCode228匯總區(qū)間示例詳解

    這篇文章主要為大家介紹了go語言題解LeetCode228匯總區(qū)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang?template?包基本原理分析

    Golang?template?包基本原理分析

    這篇文章主要為大家介紹了Golang?template?包基本原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go語言運(yùn)算符案例講解

    Go語言運(yùn)算符案例講解

    這篇文章主要介紹了Go語言運(yùn)算符案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • golang實(shí)現(xiàn)http server提供文件下載功能

    golang實(shí)現(xiàn)http server提供文件下載功能

    這篇文章主要介紹了golang實(shí)現(xiàn)http server提供文件下載功能,本文給大家簡(jiǎn)單介紹了Golang的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解Go中g(shù)in框架如何實(shí)現(xiàn)帶顏色日志

    詳解Go中g(shù)in框架如何實(shí)現(xiàn)帶顏色日志

    當(dāng)我們?cè)诮K端上(比如Goland)運(yùn)行g(shù)in框架搭建的服務(wù)時(shí),會(huì)發(fā)現(xiàn)輸出的日志是可以帶顏色的,那這是如何實(shí)現(xiàn)的呢?本文就來和大家簡(jiǎn)單講講
    2023-04-04
  • Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解

    Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解

    這篇文章主要為大家介紹了如何使用Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼

    golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼

    這篇文章主要給大家介紹了關(guān)于golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Go語言中的字符串拼接方法詳情

    Go語言中的字符串拼接方法詳情

    本文介紹Go語言中的string類型、strings包和bytes.Buffer類型,介紹幾種字符串拼接方法的相關(guān)資料,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-10-10
  • Go語言入門之基礎(chǔ)語法和常用特性解析

    Go語言入門之基礎(chǔ)語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎(chǔ)語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

互助| 英德市| 防城港市| 南岸区| 永仁县| 瓦房店市| 神农架林区| 上思县| 易门县| 鄂托克旗| 青阳县| 乐业县| 文昌市| 和平县| 合川市| 安化县| 丹棱县| 武冈市| 望江县| 安乡县| 徐州市| 繁峙县| 武功县| 达孜县| 新干县| 潢川县| 拜泉县| 双辽市| 麟游县| 景洪市| 寿宁县| 侯马市| 什邡市| 牡丹江市| 邢台县| 甘孜县| 苏尼特左旗| 元朗区| 江达县| 奉贤区| 河源市|