<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2429字,需瀏覽 5分鐘

           ·

          2022-05-13 04:54

          點擊上方“Go語言進階學(xué)習(xí)”,進行關(guān)注

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

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

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



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

          簡介

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

          方法1

          第一個方法將使用標(biāo)準(zhǔn)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的文件,

          以下是拷貝文件的時間明細(xì)( 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標(biāo)準(zhǔn)包的性能更優(yōu)。


          推薦閱讀:

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

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

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


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

          想加入學(xué)習(xí)群請在后臺回復(fù)【入群

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

          瀏覽 82
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  小泽玛利亚无码视频 | 欧美蜜桃亚洲 | 蜜桃AV无码乱码精品 | 亚洲小视频 | 中国A一级片 |