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

Go語言中Seeker接口的用法詳解

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

Seeker接口

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

一、Seeker接口簡介

設置光標的位置,通過設置的光標位置來讀寫文件
用于在數(shù)據(jù)流中將光標跳轉(zhuǎn)到指定的位置

Seeker接口表示一個定位器,可以用來定位文件或流的位置。其定義如下:

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

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

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

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

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

在這里插入圖片描述

Seek方法返回兩個值:

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

二、Seeker接口的應用場景

隨機訪問大文件:對于非常大的文件,通過Seek方法可以直接定位到文件的任意位置進行讀寫操作,而不需要從頭開始遍歷文件。

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

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

三、Seeker接口的使用示例

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

File對象實現(xiàn)了Seeker接口

在這里插入圖片描述

file對象可以直接調(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()

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

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

    //Read讀了一個字節(jié), 光標現(xiàn)在在3這個位置
    // 相對于當前位置
    file.Seek(3, io.SeekCurrent)
    file.Read(buf)

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

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

運行

在這里插入圖片描述

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

在這里插入圖片描述

四、斷點續(xù)傳

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

go語言實現(xiàn)斷點續(xù)傳的思路:

使用臨時文件記錄中斷位置.

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

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

3.設置文件讀寫偏移量,如果被暫停或者中斷了,我們就可以讀取這個temp.txt的記錄,恢復上傳

4.上傳完成后,刪除臨時文件

在這里插入圖片描述

package main

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

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

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

    // 創(chuàng)建對應的file對象,連接起來
    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中的字符的個數(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、設置讀寫的偏移量,offset是int64數(shù)據(jù)類型
    file1.Seek(count, io.SeekStart)
    file2.Seek(count, io.SeekStart)
    fmt.Println("file1/2 光標已經(jīng)移動到了目標位置")

    // 4、開始讀寫(復制、上傳)
    bufData := make([]byte, 1024)
    // 5、需要記錄讀取了多少個字節(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)閉臨時文件file3
            file3.Close()
            os.Remove(tempFile)
            break
        }

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

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

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

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

    }

}

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

相關(guān)文章

  • 一文詳解Go語言io.LimitedReader類型

    一文詳解Go語言io.LimitedReader類型

    這篇文章主要為大家介紹了Go語言io.LimitedReader類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 淺談GO中的Channel以及死鎖的造成

    淺談GO中的Channel以及死鎖的造成

    本文主要介紹了淺談GO中的Channel以及死鎖的造成,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 基于Go語言搭建靜態(tài)文件服務器的詳細教程

    基于Go語言搭建靜態(tài)文件服務器的詳細教程

    Go 是一個開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易,本文給大家介紹了基于Go語言搭建靜態(tài)文件服務器的詳細教程,文中通過圖文和代碼講解的非常詳細,需要的朋友可以參考下
    2024-10-10
  • IdeaGo啟動報錯Failed to create JVM的問題解析

    IdeaGo啟動報錯Failed to create JVM的問題解析

    這篇文章主要介紹了IdeaGo啟動報錯Failed to create JVM的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Golang 的defer執(zhí)行規(guī)則說明

    Golang 的defer執(zhí)行規(guī)則說明

    這篇文章主要介紹了Golang 的defer執(zhí)行規(guī)則說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go 內(nèi)存分配管理

    Go 內(nèi)存分配管理

    這篇文章主要介紹了Go 內(nèi)存分配管理,go 語言實際內(nèi)存、虛擬內(nèi)存怎么分配,延遲歸還是什么機制?本文結(jié)合監(jiān)控對內(nèi)存管理進行了觀測,深入學習golang對于內(nèi)存的管理機制,需要的朋友可以參考一下
    2022-02-02
  • 淺析Go語言中Channel的各種用法

    淺析Go語言中Channel的各種用法

    這篇文章主要帶大家一起來學習一下Go語言中的if語句,也就是大家口中的判斷語句。文中的示例代碼講解詳細,對我們學習Go語言有一定幫助,需要的可以參考一下
    2022-11-11
  • Go語言基礎設計模式之策略模式示例詳解

    Go語言基礎設計模式之策略模式示例詳解

    這篇文章主要為大家介紹了Go語言基礎設計模式之策略模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • GO語言實現(xiàn)的http抓包分析工具pproxy介紹

    GO語言實現(xiàn)的http抓包分析工具pproxy介紹

    這篇文章主要介紹了GO語言實現(xiàn)的http抓包分析工具pproxy介紹,本文同時對比了Fiddler、Charles等抓包軟件,需要的朋友可以參考下
    2015-03-03
  • Golang基于文件魔數(shù)判斷文件類型的案例代碼

    Golang基于文件魔數(shù)判斷文件類型的案例代碼

    這篇文章主要介紹了Golang基于文件魔數(shù)判斷文件類型,本文介紹了基于文件魔數(shù)判斷文件類型的方法,主要涉及如何ReadSeek讀取文件指定字節(jié)內(nèi)容,然后介紹文件魔數(shù),最后給出示例基于魔數(shù)判斷文件類型,需要的朋友可以參考下
    2023-02-02

最新評論

登封市| 咸阳市| 安岳县| 龙游县| 富宁县| 桃源县| 南溪县| 即墨市| 勃利县| 临西县| 滦平县| 巴南区| 宜阳县| 化隆| 常德市| 惠水县| 上饶县| 澎湖县| 大足县| 铁岭县| 嘉义市| 大英县| 普格县| 靖江市| 文成县| 祁阳县| 盐源县| 肃宁县| 永春县| 揭西县| 连南| 浦江县| 新乡县| 习水县| 渝中区| 巴彦淖尔市| 麻阳| 黑山县| 莆田市| 昆明市| 池州市|