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

淺析Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用

 更新時(shí)間:2024年01月31日 11:00:16   作者:沙蒿同學(xué)  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

傳統(tǒng)的IO流程

在傳統(tǒng)的IO流程中,通常涉及以下幾個(gè)步驟:

  • 打開(kāi)文件或建立網(wǎng)絡(luò)連接:首先,需要打開(kāi)文件或建立網(wǎng)絡(luò)連接,以便進(jìn)行讀取或?qū)懭氩僮鳌_@通常涉及到操作系統(tǒng)提供的系統(tǒng)調(diào)用,如opensocket等。
  • 讀取或?qū)懭霐?shù)據(jù):一旦文件或網(wǎng)絡(luò)連接打開(kāi),就可以進(jìn)行數(shù)據(jù)的讀取或?qū)懭氩僮?。讀取操作將從文件或網(wǎng)絡(luò)連接中獲取數(shù)據(jù),而寫(xiě)入操作將將數(shù)據(jù)寫(xiě)入文件或發(fā)送到網(wǎng)絡(luò)連接中。這些操作通常涉及到系統(tǒng)調(diào)用,如readwrite。
  • 緩沖區(qū):為了提高IO性能,通常會(huì)使用緩沖區(qū)。緩沖區(qū)是一塊內(nèi)存區(qū)域,用于臨時(shí)存儲(chǔ)要讀取或?qū)懭氲臄?shù)據(jù)。數(shù)據(jù)首先被讀取到緩沖區(qū)中,然后從緩沖區(qū)中寫(xiě)入到文件或網(wǎng)絡(luò)連接中,或者從緩沖區(qū)中讀取數(shù)據(jù)。
  • 關(guān)閉文件或網(wǎng)絡(luò)連接:當(dāng)讀取或?qū)懭氩僮魍瓿珊?,需要關(guān)閉文件或網(wǎng)絡(luò)連接。這通常涉及到系統(tǒng)調(diào)用,如close。

在傳統(tǒng)的IO流程中,每次讀取或?qū)懭氩僮鞫紩?huì)涉及到系統(tǒng)調(diào)用,這會(huì)導(dǎo)致較高的開(kāi)銷(xiāo)。為了提高性能,通常會(huì)使用緩沖區(qū)來(lái)減少系統(tǒng)調(diào)用的次數(shù)。緩沖區(qū)可以一次讀取或?qū)懭攵鄠€(gè)數(shù)據(jù),從而減少了系統(tǒng)調(diào)用的開(kāi)銷(xiāo)。

緩沖區(qū)

上面我們了解到緩沖區(qū)這個(gè)概念,那什么是緩沖區(qū)呢?

內(nèi)存緩沖區(qū)是計(jì)算機(jī)中的一種臨時(shí)存儲(chǔ)區(qū)域,用于暫時(shí)存儲(chǔ)數(shù)據(jù)。它通常用于提高數(shù)據(jù)讀寫(xiě)的效率,減少對(duì)底層存儲(chǔ)設(shè)備的頻繁訪問(wèn)。

緩沖區(qū)的主要目的是在數(shù)據(jù)的生產(chǎn)者和消費(fèi)者之間起到一個(gè)中間層的作用。當(dāng)數(shù)據(jù)被生產(chǎn)者生成時(shí),它首先被寫(xiě)入緩沖區(qū),而不是直接寫(xiě)入到目標(biāo)存儲(chǔ)設(shè)備。然后,消費(fèi)者可以從緩沖區(qū)中讀取數(shù)據(jù)。

緩沖區(qū)的大小是有限的,一旦緩沖區(qū)被填滿(mǎn),生產(chǎn)者必須等待消費(fèi)者讀取數(shù)據(jù),以便為新的數(shù)據(jù)騰出空間。同樣,如果緩沖區(qū)為空,消費(fèi)者必須等待生產(chǎn)者生成新的數(shù)據(jù)。

內(nèi)存緩沖區(qū)可以用于各種場(chǎng)景,比如:

  • 文件讀寫(xiě):在讀取或?qū)懭氪笪募r(shí),可以使用內(nèi)存緩沖區(qū)來(lái)提高讀寫(xiě)性能。數(shù)據(jù)首先被讀取到緩沖區(qū)中,然后批量地寫(xiě)入或讀取到磁盤(pán)上的文件。
  • 網(wǎng)絡(luò)通信:在網(wǎng)絡(luò)通信中,數(shù)據(jù)通常需要經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議的封裝和解析。使用內(nèi)存緩沖區(qū)可以將數(shù)據(jù)暫時(shí)存儲(chǔ)起來(lái),以便進(jìn)行協(xié)議處理和網(wǎng)絡(luò)傳輸。
  • 數(shù)據(jù)庫(kù)操作:在數(shù)據(jù)庫(kù)操作中,使用內(nèi)存緩沖區(qū)可以提高數(shù)據(jù)的讀寫(xiě)性能。數(shù)據(jù)首先被寫(xiě)入緩沖區(qū),然后批量地寫(xiě)入到數(shù)據(jù)庫(kù)中,或者從緩沖區(qū)中讀取數(shù)據(jù)進(jìn)行查詢(xún)。

需要注意的是,內(nèi)存緩沖區(qū)只是一個(gè)臨時(shí)存儲(chǔ)區(qū)域,數(shù)據(jù)在緩沖區(qū)中并不是持久化的。一旦程序結(jié)束或緩沖區(qū)被清空,緩沖區(qū)中的數(shù)據(jù)就會(huì)丟失。因此,在使用內(nèi)存緩沖區(qū)時(shí)需要確保數(shù)據(jù)的正確性和一致性。

go緩沖區(qū)

在Go語(yǔ)言中,緩沖區(qū)的大小是由創(chuàng)建緩沖區(qū)時(shí)指定的參數(shù)決定的。在標(biāo)準(zhǔn)庫(kù)中,可以使用bufio包提供的NewWriterSize函數(shù)創(chuàng)建一個(gè)指定大小的緩沖區(qū)。

默認(rèn)情況下,bufio.Writer的緩沖區(qū)大小為4096字節(jié)(4KB),即調(diào)用bufio.NewWriter創(chuàng)建的緩沖區(qū)大小為4096字節(jié)。這是因?yàn)?096字節(jié)是一個(gè)常見(jiàn)的磁盤(pán)塊大小,對(duì)于大多數(shù)應(yīng)用場(chǎng)景來(lái)說(shuō),這個(gè)大小已經(jīng)足夠了。

如果需要自定義緩沖區(qū)的大小,可以使用bufio.NewWriterSize函數(shù)來(lái)指定緩沖區(qū)的大小。例如,可以通過(guò)bufio.NewWriterSize(writer, 8192)來(lái)創(chuàng)建一個(gè)大小為8192字節(jié)(8KB)的緩沖區(qū)。

為什么

為什么go編程中要設(shè)置緩沖區(qū)呢?其實(shí)我們上面都有提到:設(shè)置緩沖區(qū)的一個(gè)主要目的就是為了減少頻繁的IO操作。

在進(jìn)行IO操作時(shí),例如讀取或?qū)懭胛募?,每次都直接操作底層的存?chǔ)設(shè)備(如磁盤(pán)或網(wǎng)絡(luò))可能會(huì)導(dǎo)致性能下降。這是因?yàn)槊看蜪O操作都需要進(jìn)行系統(tǒng)調(diào)用,這涉及到內(nèi)核和用戶(hù)空間之間的上下文切換,以及硬件設(shè)備的訪問(wèn)延遲。

通過(guò)使用緩沖區(qū),可以將數(shù)據(jù)暫時(shí)存儲(chǔ)在內(nèi)存中,而不是直接與底層存儲(chǔ)設(shè)備進(jìn)行交互。這樣可以將多個(gè)小的IO操作合并為一個(gè)大的IO操作,從而減少了系統(tǒng)調(diào)用的次數(shù)。這種批量處理的方式通常比頻繁的小IO操作更高效。

此外,緩沖區(qū)還可以提供更好的數(shù)據(jù)傳輸效率。當(dāng)數(shù)據(jù)被寫(xiě)入緩沖區(qū)時(shí),實(shí)際的IO操作可以被推遲到緩沖區(qū)被填滿(mǎn)或手動(dòng)刷新緩沖區(qū)時(shí)才執(zhí)行。這樣可以減少I(mǎi)O操作的次數(shù),提高數(shù)據(jù)傳輸?shù)男省?/p>

go 緩沖區(qū)(Buffer)是分配在堆還是棧?

在Go語(yǔ)言中,緩沖區(qū)(Buffer)的申請(qǐng)是在堆上進(jìn)行的。

Go語(yǔ)言中的??臻g是有限的,而且棧上的內(nèi)存分配和釋放是由編譯器自動(dòng)管理的,無(wú)法手動(dòng)控制。因此,較大的緩沖區(qū)無(wú)法放在棧上進(jìn)行申請(qǐng)。

相反,Go語(yǔ)言中的堆空間是用于動(dòng)態(tài)分配內(nèi)存的,可以手動(dòng)控制內(nèi)存的申請(qǐng)和釋放。當(dāng)我們使用make關(guān)鍵字創(chuàng)建一個(gè)切片或映射時(shí),內(nèi)存就會(huì)在堆上進(jìn)行動(dòng)態(tài)分配。而bufio包中的緩沖區(qū)也是通過(guò)make函數(shù)在堆上進(jìn)行申請(qǐng)的。

緩沖區(qū)的申請(qǐng)通常是在創(chuàng)建緩沖區(qū)時(shí)進(jìn)行的,例如使用bufio.NewWriterbufio.NewWriterSize函數(shù)來(lái)創(chuàng)建一個(gè)緩沖區(qū)對(duì)象。這個(gè)過(guò)程會(huì)調(diào)用make函數(shù)來(lái)分配足夠大小的內(nèi)存,并返回一個(gè)指向該內(nèi)存的指針。

fmt打印

示例

fmt.Println("Hello, world!"),大家平時(shí)用得最多了,這不就是打印輸出到控制臺(tái)嘛

當(dāng)執(zhí)行fmt.Println("Hello, world!")命令時(shí),會(huì)調(diào)用fmt包內(nèi)的Println函數(shù)來(lái)打印輸出。

首先,Println函數(shù)會(huì)根據(jù)傳入的參數(shù)列表構(gòu)建一個(gè)字符串,并將其傳遞給Fprintln函數(shù)。Fprintln函數(shù)是fmt包內(nèi)部的一個(gè)輔助函數(shù),它會(huì)將構(gòu)建的字符串寫(xiě)入到標(biāo)準(zhǔn)輸出(即控制臺(tái))。

Fprintln函數(shù)內(nèi)部,它會(huì)調(diào)用newPrinter函數(shù)來(lái)創(chuàng)建一個(gè)pp(printer)對(duì)象。pp對(duì)象是printer結(jié)構(gòu)體的實(shí)例,它包含了打印輸出的相關(guān)配置和狀態(tài)信息。

接下來(lái),Fprintln函數(shù)會(huì)調(diào)用pp.print方法來(lái)實(shí)際執(zhí)行打印輸出的操作。在print方法中,它會(huì)根據(jù)配置的格式化選項(xiàng),將構(gòu)建的字符串寫(xiě)入到pp.buf緩沖區(qū)中。

如果緩沖區(qū)已滿(mǎn),或者遇到換行符(\n),print方法會(huì)調(diào)用pp.write方法將緩沖區(qū)的內(nèi)容寫(xiě)入到標(biāo)準(zhǔn)輸出。write方法會(huì)使用os.Stdout作為目標(biāo),將緩沖區(qū)的內(nèi)容寫(xiě)入到控制臺(tái)。

最后,Fprintln函數(shù)會(huì)調(diào)用pp.free方法來(lái)釋放pp對(duì)象占用的內(nèi)存,以及清空緩沖區(qū)。

總結(jié)起來(lái),當(dāng)執(zhí)行fmt.Println("Hello, world!")命令時(shí),fmt包內(nèi)部會(huì)構(gòu)建打印輸出的字符串,并將其寫(xiě)入到標(biāo)準(zhǔn)輸出。這個(gè)過(guò)程涉及到字符串的構(gòu)建、緩沖區(qū)的管理和標(biāo)準(zhǔn)輸出的寫(xiě)入。通過(guò)使用printer結(jié)構(gòu)體和相關(guān)方法,fmt包實(shí)現(xiàn)了方便的打印輸出功能。

源碼查看

// ...
func main() {
    fmt.Println("Hello, world!")
}

// fmt 包
// ...
func Println(a ...any) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}
// ...
func Fprintln(w io.Writer, a ...any) (n int, err error) {
	p := newPrinter()
	p.doPrintln(a)
	n, err = w.Write(p.buf)
	p.free()
	return
}

當(dāng)打印內(nèi)容很大怎么辦

當(dāng)打印的內(nèi)容超出了緩沖區(qū)的大小時(shí),fmt包會(huì)動(dòng)態(tài)擴(kuò)展緩沖區(qū)的大小,以容納更大的數(shù)據(jù),并完整地輸出到標(biāo)準(zhǔn)輸出。

在執(zhí)行打印操作時(shí),fmt包會(huì)檢查緩沖區(qū)的剩余空間是否足夠容納當(dāng)前要打印的內(nèi)容。如果空間不足,fmt包會(huì)自動(dòng)擴(kuò)展緩沖區(qū)的大小,通常是將緩沖區(qū)的大小翻倍。

例如,在默認(rèn)情況下,fmt包的緩沖區(qū)大小為4KB。如果要打印的內(nèi)容超過(guò)了4KB,fmt包會(huì)自動(dòng)將緩沖區(qū)擴(kuò)展到8KB,以容納更多的數(shù)據(jù)。如果仍然不夠,會(huì)繼續(xù)擴(kuò)展到16KB,以此類(lèi)推,直到能夠容納所有的數(shù)據(jù)。

當(dāng)緩沖區(qū)大小足夠容納要打印的內(nèi)容時(shí),fmt包會(huì)將數(shù)據(jù)寫(xiě)入緩沖區(qū)中。當(dāng)緩沖區(qū)滿(mǎn)了或者遇到換行符(\n)時(shí),fmt包會(huì)將緩沖區(qū)的內(nèi)容寫(xiě)入到標(biāo)準(zhǔn)輸出,確保完整地輸出所有的數(shù)據(jù)。

也就是說(shuō)我有一個(gè)8k的打印內(nèi)容,而緩沖區(qū)大小為4KB,那么在第一次寫(xiě)入緩沖區(qū)后,緩沖區(qū)將被填滿(mǎn)。此時(shí),fmt包會(huì)進(jìn)行一次IO操作,將緩沖區(qū)的內(nèi)容寫(xiě)入標(biāo)準(zhǔn)輸出。

由于緩沖區(qū)已滿(mǎn),第二次寫(xiě)入操作將觸發(fā)另一次IO操作,將剩余的內(nèi)容寫(xiě)入標(biāo)準(zhǔn)輸出。

因此,在這種情況下,fmt包會(huì)進(jìn)行兩次IO操作,將完整的8KB內(nèi)容寫(xiě)入標(biāo)準(zhǔn)輸出。第一次是在緩沖區(qū)填滿(mǎn)后,第二次是在第二次寫(xiě)入時(shí)。

到此這篇關(guān)于淺析Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用的文章就介紹到這了,更多相關(guān)Go緩沖區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn)

    golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn)

    本文主要介紹了golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)的方法

    GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)的方法

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)的方法,實(shí)例分析了Go語(yǔ)言實(shí)現(xiàn)TCP服務(wù)的技巧,需要的朋友可以參考下
    2015-03-03
  • goland設(shè)置顏色和字體的操作

    goland設(shè)置顏色和字體的操作

    這篇文章主要介紹了goland設(shè)置顏色和字體的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Golang空結(jié)構(gòu)體struct{}用途,你知道嗎

    Golang空結(jié)構(gòu)體struct{}用途,你知道嗎

    這篇文章主要介紹了Golang空結(jié)構(gòu)體struct{}用途,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Golang實(shí)現(xiàn)http文件上傳小功能的案例

    Golang實(shí)現(xiàn)http文件上傳小功能的案例

    這篇文章主要介紹了Golang實(shí)現(xiàn)http文件上傳小功能的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang構(gòu)建工具M(jìn)akefile使用詳解

    golang構(gòu)建工具M(jìn)akefile使用詳解

    這篇文章主要為大家介紹了golang構(gòu)建工具M(jìn)akefile的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能

    golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能

    這篇文章主要介紹了golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,文章通過(guò)golang導(dǎo)出excel文件返回給web,實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • Go語(yǔ)言入門(mén)教程之基礎(chǔ)語(yǔ)法快速入門(mén)

    Go語(yǔ)言入門(mén)教程之基礎(chǔ)語(yǔ)法快速入門(mén)

    這篇文章主要介紹了Go語(yǔ)言入門(mén)教程之基礎(chǔ)語(yǔ)法快速入門(mén),本文講解了值類(lèi)型、變量、常量、循環(huán)、條件語(yǔ)句、條件枚舉等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Golang實(shí)現(xiàn)快速求冪的方法詳解

    Golang實(shí)現(xiàn)快速求冪的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)快速求冪,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下
    2022-06-06
  • go grpc高級(jí)用法

    go grpc高級(jí)用法

    RPC是遠(yuǎn)程過(guò)程調(diào)用,可以像調(diào)用本地服務(wù)一樣取調(diào)用遠(yuǎn)程服務(wù),本文主要介紹了go grpc高級(jí)用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01

最新評(píng)論

馆陶县| 团风县| 汾西县| 彭山县| 云浮市| 黄冈市| 株洲县| 大庆市| 建德市| 康保县| 花莲县| 交口县| 依兰县| 德化县| 霍州市| 垫江县| 江孜县| 呼图壁县| 阿拉善盟| 宁晋县| 三江| 湛江市| 三河市| 松溪县| 新民市| 偏关县| 荥经县| 游戏| 汾阳市| 浦城县| 黎城县| 正镶白旗| 浦县| 德兴市| 长顺县| 灵武市| 信阳市| 韩城市| 南溪县| 夏津县| 民勤县|