1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Go語言中拷貝文件的幾種常用的方式

        共 2429字,需瀏覽 5分鐘

         ·

        2022-05-13 04:54

        點擊上方“Go語言進階學習”,進行關注

        回復“Go語言”即可獲贈Python從入門到進階共10本電子書

        連峰去天不盈尺,枯松倒掛倚絕壁。

        Go語言中拷貝文件的幾種常用的方式



        “ 閱讀本文大概需要4.2分鐘 ”

        簡介

        本篇文章將介紹Go語言中,最最最常用的3種拷貝文件的方法,這三種方法各有利弊,我們只需要在應用中選擇最合適的即可,不必盲目追求性能。

        方法1

        第一個方法將使用標準Go庫的 io.Copy()函數(shù)。以下是使用io.Copy()實現(xiàn)的拷貝文件代碼片段:

        1. func copy(src, dst string) (int64, error) {

        2. ? ? ? ?sourceFileStat, err := os.Stat(src)

        3. ? ? ? ?if err != nil {

        4. ? ? ? ? ? ? ? ?return 0, err

        5. ? ? ? ?}

        6. ? ? ? ?if !sourceFileStat.Mode().IsRegular() {

        7. ? ? ? ? ? ? ? ?return 0, fmt.Errorf("%s is not a regular file", src)

        8. ? ? ? ?}

        9. ? ? ? ?source, err := os.Open(src)

        10. ? ? ? ?if err != nil {

        11. ? ? ? ? ? ? ? ?return 0, err

        12. ? ? ? ?}

        13. ? ? ? ?defer source.Close()

        14. ? ? ? ?destination, err := os.Create(dst)

        15. ? ? ? ?if err != nil {

        16. ? ? ? ? ? ? ? ?return 0, err

        17. ? ? ? ?}

        18. ? ? ? ?defer destination.Close()

        19. ? ? ? ?nBytes, err := io.Copy(destination, source)

        20. ? ? ? ?return nBytes, err

        21. }

        方法二

        第二中方法是使用ioutil包中的 ioutil.WriteFile()ioutil.ReadFile(),但由于使用一次性讀取文件,再一次性寫入文件的方式,所以該方法不適用于大文件,容易內(nèi)存溢出。

        1. input, err := ioutil.ReadFile(sourceFile)

        2. ? ? ? ?if err != nil {

        3. ? ? ? ? ? ? ? ?fmt.Println(err)

        4. ? ? ? ? ? ? ? ?return

        5. ? ? ? ?}

        6. ? ? ? ?err = ioutil.WriteFile(destinationFile, input, 0644)

        7. ? ? ? ?if err != nil {

        8. ? ? ? ? ? ? ? ?fmt.Println("Error creating", destinationFile)

        9. ? ? ? ? ? ? ? ?fmt.Println(err)

        10. ? ? ? ? ? ? ? ?return

        11. ? ? ? ?}

        方法三

        最后是使用os包中的 os.Read()os.Write(),此方法是按塊讀取文件,塊的大小也會影響到程序的性能。

        1. ?buf := make([]byte, BUFFERSIZE)

        2. ? ? ? ?for {

        3. ? ? ? ? ? ? ? ?n, err := source.Read(buf)

        4. ? ? ? ? ? ? ? ?if err != nil && err != io.EOF {

        5. ? ? ? ? ? ? ? ? ? ? ? ?return err

        6. ? ? ? ? ? ? ? ?}

        7. ? ? ? ? ? ? ? ?if n == 0 {

        8. ? ? ? ? ? ? ? ? ? ? ? ?break

        9. ? ? ? ? ? ? ? ?}

        10. ? ? ? ? ? ? ? ?if _, err := destination.Write(buf[:n]); err != nil {

        11. ? ? ? ? ? ? ? ? ? ? ? ?return err

        12. ? ? ? ? ? ? ? ?}

        13. ? ? ? ?}

        性能

        這三種方式都能很方便的實現(xiàn)拷貝文件功能,那他們的性能如何呢,下面我們來嘗試對比一下。三種方式都來拷貝同一個500M的文件,

        以下是拷貝文件的時間明細( cp1.go是第一種方式, cp2.go是第二種方式, cp3.go是第三種方式)

        1. $ ls -l INPUT

        2. -rw-r--r-- ?1 mtsouk ?staff ?512000000 Jun ?5 09:39 INPUT

        3. $ time go run cp1.go INPUT /tmp/cp1

        4. Copied 512000000 bytes!

        5. real ? ?0m0.980s

        6. user ? ?0m0.219s

        7. sys ? ? 0m0.719s

        8. $ time go run cp2.go INPUT /tmp/cp2

        9. real ? ?0m1.139s

        10. user ? ?0m0.196s

        11. sys ? ? 0m0.654s

        12. $ time go run cp3.go INPUT /tmp/cp3 1000000

        13. Copying INPUT to /tmp/cp3

        14. real ? ?0m1.025s

        15. user ? ?0m0.195s

        16. sys ? ? 0m0.486s

        從以上數(shù)據(jù)來看3種方式的性能非常接近,但依然可以看出Go的io標準包的性能更優(yōu)。


        推薦閱讀:

        Go的并發(fā)沒有它,就像iphone沒有網(wǎng)絡一樣

        Go圖譜和技巧,有了它事半功倍

        -------------------?End?-------------------


        歡迎大家點贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入學習群請在后臺回復【入群

        萬水千山總是情,點個【在看】行不行

        瀏覽 82
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            公的淫之手日剧 | 明星大尺度激情做爰视频 | 国产精品秘 入口久久熟女沈阳 | www.夜夜| 一级a一级a爱片免费 | 日韩精品一区二区三区四区 | 欧美黄色一级毛片 | 欧美一级特黄A片免费观看密森 | 国产精品久久久久久久久久久久久久久 | 久久久社区 |