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

Go語(yǔ)言中Seeker接口的用法詳解

 更新時(shí)間:2024年10月10日 09:21:33   作者:景天科技苑  
Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的io包提供了一系列接口,用于處理各種I/O操作,其中Seeker接口在處理大文件或需要隨機(jī)訪問(wèn)的場(chǎng)景中非常有用,本文將結(jié)合具體案例,詳細(xì)介紹Go語(yǔ)言中io包的Seeker接口的用法,需要的朋友可以參考下

Seeker接口

在現(xiàn)代軟件開(kāi)發(fā)中,高效的輸入輸出(I/O)操作是提高程序性能的關(guān)鍵之一。特別是在處理大量數(shù)據(jù)時(shí),I/O操作的效率直接影響到應(yīng)用程序的響應(yīng)速度和用戶體驗(yàn)。Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的io包提供了一系列接口,用于處理各種I/O操作,其中Seeker接口在處理大文件或需要隨機(jī)訪問(wèn)的場(chǎng)景中非常有用。本文將結(jié)合具體案例,詳細(xì)介紹Go語(yǔ)言中io包的Seeker接口的用法。

一、Seeker接口簡(jiǎn)介

設(shè)置光標(biāo)的位置,通過(guò)設(shè)置的光標(biāo)位置來(lái)讀寫(xiě)文件
用于在數(shù)據(jù)流中將光標(biāo)跳轉(zhuǎn)到指定的位置

Seeker接口表示一個(gè)定位器,可以用來(lái)定位文件或流的位置。其定義如下:

type Seeker interface {  
    Seek(offset int64, whence int) (int64, error)  
}

Seek方法接受兩個(gè)參數(shù):

offset:相對(duì)位移量,表示從起始位置移動(dòng)的字節(jié)數(shù)。

whence:起始位置,可以是以下三個(gè)常量之一:

  • io.SeekStart:從文件開(kāi)頭開(kāi)始計(jì)算偏移量。
  • io.SeekCurrent:從當(dāng)前文件指針位置開(kāi)始計(jì)算偏移量。
  • io.SeekEnd:從文件末尾開(kāi)始計(jì)算偏移量(此時(shí)offset通常為負(fù)數(shù),表示向前移動(dòng))。

在這里插入圖片描述

Seek方法返回兩個(gè)值:

  • position:移動(dòng)后的文件指針位置(相對(duì)于文件開(kāi)頭的字節(jié)數(shù))。
  • err:可能發(fā)生的錯(cuò)誤。

二、Seeker接口的應(yīng)用場(chǎng)景

隨機(jī)訪問(wèn)大文件:對(duì)于非常大的文件,通過(guò)Seek方法可以直接定位到文件的任意位置進(jìn)行讀寫(xiě)操作,而不需要從頭開(kāi)始遍歷文件。

斷點(diǎn)續(xù)傳:在網(wǎng)絡(luò)傳輸或文件復(fù)制等場(chǎng)景中,如果傳輸過(guò)程中斷,可以通過(guò)Seek方法定位到上次傳輸?shù)臄帱c(diǎn),繼續(xù)傳輸剩余的數(shù)據(jù)。

日志文件分析:對(duì)于包含多條記錄的日志文件,可以通過(guò)Seek方法快速定位到特定記錄的位置,進(jìn)行日志分析或錯(cuò)誤排查。

三、Seeker接口的使用示例

以下是一個(gè)結(jié)合具體案例的示例代碼,展示了如何使用Seeker接口來(lái)定位文件位置并進(jìn)行讀寫(xiě)操作。

File對(duì)象實(shí)現(xiàn)了Seeker接口

在這里插入圖片描述

file對(duì)象可以直接調(diào)用Seek方法

我們先看下a.txt文件

在這里插入圖片描述

代碼示例:

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    // 讀取文件
    file, _ := os.OpenFile("F:\\goworks\\src\\jingtian\\yufa\\io操作\\a.txt", os.O_RDWR, os.ModePerm)
    // defer close
    defer file.Close()

    // 測(cè)試seek
    // 相對(duì)開(kāi)始位置。io.SeekStart
    // 相對(duì)于文件末尾, io.SeekEnd
    // func (f *File) Seek(offset int64, whence int) (ret int64, err error)
    //相對(duì)于開(kāi)始位置,光標(biāo)偏移兩個(gè)字節(jié)
    file.Seek(2, io.SeekStart)
    //創(chuàng)建一個(gè)字節(jié)的buffer
    buf := []byte{0}
    file.Read(buf)

    fmt.Println(string(buf)) // n

    //Read讀了一個(gè)字節(jié), 光標(biāo)現(xiàn)在在3這個(gè)位置
    // 相對(duì)于當(dāng)前位置
    file.Seek(3, io.SeekCurrent)
    file.Read(buf)

    fmt.Println(string(buf)) // a

    // 在結(jié)尾追加內(nèi)容
    //相對(duì)于結(jié)束位置偏移0,光標(biāo)就設(shè)在了結(jié)束位置
    file.Seek(0, io.SeekEnd)
    //寫(xiě)入內(nèi)容
    file.WriteString("hahahaha")
}

運(yùn)行

在這里插入圖片描述

再看下a.txt,可見(jiàn)在末尾寫(xiě)入了我們指定的內(nèi)容

在這里插入圖片描述

四、斷點(diǎn)續(xù)傳

斷點(diǎn)續(xù)傳是在下載或上傳時(shí),將下載或上傳任務(wù)(一個(gè)文件或一個(gè)壓縮包)人為的劃分為幾個(gè)部分,每一個(gè)部分采用一個(gè)線程進(jìn)行上傳或下載,如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開(kāi)始繼續(xù)上傳或者下載未完成的部分,而沒(méi)有必要從頭開(kāi)始上傳或者下載。

go語(yǔ)言實(shí)現(xiàn)斷點(diǎn)續(xù)傳的思路:

使用臨時(shí)文件記錄中斷位置.

1.文件上傳時(shí),先創(chuàng)建上傳一個(gè)新的文件

2.創(chuàng)建記錄中斷位置的臨時(shí)文件,需要記住上一次傳遞了多少數(shù)據(jù)、temp.txt

3.設(shè)置文件讀寫(xiě)偏移量,如果被暫?;蛘咧袛嗔?,我們就可以讀取這個(gè)temp.txt的記錄,恢復(fù)上傳

4.上傳完成后,刪除臨時(shí)文件

在這里插入圖片描述

package main

import (
    "fmt"
    "io"
    "os"
    "strconv"
)

// 斷點(diǎn)續(xù)傳
func main() {

    // 傳輸源文件地址
    srcFile := "D:\\downloads\\mingw.7z"
    // 傳輸?shù)哪繕?biāo)位置
    destFile := "F:\\goworks\\src\\jingtian\\yufa\\io操作\\server\\mingw.7z"
    // 臨時(shí)記錄文件
    tempFile := "F:\\goworks\\src\\jingtian\\yufa\\io操作\\temp.txt"

    // 創(chuàng)建對(duì)應(yīng)的file對(duì)象,連接起來(lái)
    file1, _ := os.Open(srcFile)
    file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
    file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
    defer file1.Close()
    defer file2.Close()
    fmt.Println("file1/2/3 文件連接建立完畢")

    // 1、讀取temp.txt
    file3.Seek(0, io.SeekStart)
    buf := make([]byte, 1024)
    n, _ := file3.Read(buf) //這里的n是讀取file3中的字符的個(gè)數(shù),比如1024,得到的n是4.所以要借助string轉(zhuǎn)
    //查看返回的n的數(shù)據(jù)類型
    fmt.Printf("查看n的數(shù)據(jù)類型%T\n", n)
    fmt.Println("n的值為", n)

    // 2、先轉(zhuǎn)換成string,然后再轉(zhuǎn)換成數(shù)字。
    countStr := string(buf[:n])
    count, _ := strconv.ParseInt(countStr, 10, 64)
    fmt.Println("temp.txt中記錄的值為:", count) // 5120

    // 3、設(shè)置讀寫(xiě)的偏移量,offset是int64數(shù)據(jù)類型
    file1.Seek(count, io.SeekStart)
    file2.Seek(count, io.SeekStart)
    fmt.Println("file1/2 光標(biāo)已經(jīng)移動(dòng)到了目標(biāo)位置")

    // 4、開(kāi)始讀寫(xiě)(復(fù)制、上傳)
    bufData := make([]byte, 1024)
    // 5、需要記錄讀取了多少個(gè)字節(jié)
    total := int(count)

    for {
        fmt.Println("傳輸了,", total)
        // 讀取數(shù)據(jù)
        readNum, err := file1.Read(bufData)
        if err == io.EOF || readNum == 0 { // file1 讀取完畢了
            fmt.Println("文件傳輸完畢了")
            //上傳完文件再關(guān)閉臨時(shí)文件file3
            file3.Close()
            os.Remove(tempFile)
            break
        }

        // 向目標(biāo)文件中寫(xiě)入數(shù)據(jù),返回寫(xiě)的字節(jié)數(shù)和錯(cuò)誤
        writeNum, err := file2.Write(bufData[:readNum])

        // 將寫(xiě)入數(shù)據(jù)放到 total中, 在這里total 就是傳輸?shù)倪M(jìn)度
        total = total + writeNum

        // temp.txt 存放臨時(shí)記錄數(shù)據(jù)
        file3.Seek(0, io.SeekStart) // 將光標(biāo)重置到開(kāi)頭
        //將數(shù)字轉(zhuǎn)換成字符串寫(xiě)入,這里total逐漸變大不存在覆蓋不完的問(wèn)題。如果存在覆蓋不完問(wèn)題,使用os.Truncate(fileName, 0)來(lái)清空文件內(nèi)容
        // os.Truncate(fileName, 0) 截取指定長(zhǎng)度字節(jié)的內(nèi)容,其余內(nèi)容會(huì)被刪除
        file3.WriteString(strconv.Itoa(total))

        //模擬斷電
        //if total > 10000 {
        //    panic("斷電了")
        //}

    }

}

在這里插入圖片描述

模擬傳輸過(guò)程中出現(xiàn)問(wèn)題,比如斷電

在這里插入圖片描述

恢復(fù)電后繼續(xù)上傳

在這里插入圖片描述

以上就是Go語(yǔ)言中Seeker接口的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go Seeker接口用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言中的變量聲明和賦值

    Go語(yǔ)言中的變量聲明和賦值

    這篇文章主要介紹了Go語(yǔ)言中的變量聲明和賦值的方法,十分的細(xì)致全面,有需要的小伙伴可以參考下。
    2015-04-04
  • GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開(kāi)聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)?lái)了完整代碼,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 詳談Golang uint類型溢出問(wèn)題

    詳談Golang uint類型溢出問(wèn)題

    在Go語(yǔ)言中,uint類型的無(wú)符號(hào)整數(shù)在達(dá)到其最大值時(shí)會(huì)發(fā)生回繞,為了避免溢出,應(yīng)確保不超出最大值,使用條件語(yǔ)句檢查接近溢出點(diǎn),選擇合適的數(shù)據(jù)類型,進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理,或者使用數(shù)學(xué)庫(kù)處理大整數(shù)
    2024-12-12
  • Go語(yǔ)言實(shí)現(xiàn)配置熱加載的方法分享

    Go語(yǔ)言實(shí)現(xiàn)配置熱加載的方法分享

    web項(xiàng)目,經(jīng)常需要熱啟動(dòng)各種各樣的配置信息,一旦這些服務(wù)發(fā)生變更,我們需要重新啟動(dòng)web server,以使配置生效,實(shí)現(xiàn)配置熱加載,本文為大家整理了幾個(gè)方法實(shí)現(xiàn)這個(gè)需求,需要的可以參考下
    2023-05-05
  • Go語(yǔ)言等待組sync.WaitGrou的使用示例

    Go語(yǔ)言等待組sync.WaitGrou的使用示例

    本文主要介紹了Go語(yǔ)言等待組sync.WaitGrou的使用示例,sync.WaitGroup只有3個(gè)方法,Add(),Done(),Wait(),下面就來(lái)具體的介紹一下如何使用,感興趣的可以了解一下
    2024-08-08
  • Golang實(shí)現(xiàn)Trie(前綴樹(shù))的示例

    Golang實(shí)現(xiàn)Trie(前綴樹(shù))的示例

    本文主要介紹了Golang實(shí)現(xiàn)Trie(前綴樹(shù))的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • GoLang日志監(jiān)控系統(tǒng)實(shí)現(xiàn)

    GoLang日志監(jiān)控系統(tǒng)實(shí)現(xiàn)

    這篇文章主要介紹了GoLang日志監(jiān)控系統(tǒng)的實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • Go語(yǔ)言實(shí)現(xiàn)的樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法實(shí)例

    Go語(yǔ)言實(shí)現(xiàn)的樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法實(shí)例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法,實(shí)例分析了樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang實(shí)踐指南之獲取目錄文件列表

    Golang實(shí)踐指南之獲取目錄文件列表

    在搭建項(xiàng)目中一般都會(huì)有確定項(xiàng)目根目錄的絕對(duì)路徑的需求,下面這篇文章主要給大家介紹了關(guān)于Golang實(shí)踐指南之獲取目錄文件列表的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Golang WaitGroup實(shí)現(xiàn)原理解析

    Golang WaitGroup實(shí)現(xiàn)原理解析

    WaitGroup是Golang并發(fā)的兩種方式之一,一個(gè)是Channel,另一個(gè)是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論