首頁  >  文章  >  後端開發  >  golang壓縮方法

golang壓縮方法

WBOY
WBOY原創
2023-05-22 09:47:062179瀏覽

golang 是一種非常流行的高效能程式語言,具有比較強大的程式碼執行能力,而且它的標準函式庫中也擁有許多對各種檔案壓縮格式進行處理的方法。本文將介紹 golang 壓縮方法的使用。

首先需要引入 "compress" 和 "archive" 套件,它們都是 golang 標準函式庫中的壓縮處理相關套件。但具體選用哪一個,需要根據壓縮格式來進行選擇。

  1. gzip 壓縮

在 golang 中進行 gzip 壓縮的方法,同樣利用標準函式庫中的 "compress/gzip" 套件。

這裡我們以一個字串為例進行壓縮:

package main

import (
    "bytes"
    "compress/gzip"
    "fmt"
)

func main() {
    str := "golang gzip test"
    var buf bytes.Buffer
    z := gzip.NewWriter(&buf)
    _, err := z.Write([]byte(str))
    if err != nil {
        panic(err)
    }
    err = z.Close()
    if err != nil {
        panic(err)
    }
    fmt.Println("gzip:", buf.String())
}

這段程式碼中首先創建了一個buffer 緩存,然後再創建了一個gzip.Write 對象,並且將buffer 傳遞給了這個對象。接著,將需要進行壓縮的字串寫入這個物件中,最後關閉這個 writer 物件。

列印結果為:gzip: �▒H-IM0189WVnV-I�HI�J-.�V�R,Q�P.�-NMV-.WVN��O�,�R��S �Q�L��KՅ_(�з)_/�

  1. zlib 壓縮

zlib 是無損資料壓縮格式,採用Lempel-Ziv 演算法和Huffam編碼。它的壓縮率比較高,壓縮速度也比較快,可用於某些資料傳輸和儲存場景。

在 golang 中進行 zlib 壓縮的方法,同樣利用標準函式庫中的 "compress/zlib" 套件。

這裡我們以一個字串為例進行壓縮:

package main

import (
    "bytes"
    "compress/zlib"
    "fmt"
)

func main() {
    str := "golang zlib test"
    var buf bytes.Buffer
    w := zlib.NewWriter(&buf)
    _, err := w.Write([]byte(str))
    if err != nil {
        panic(err)
    }
    err = w.Close()
    if err != nil {
        panic(err)
    }
    fmt.Println("zlib:", buf.String())
}

這段程式碼中首先創建了一個buffer 緩存,然後再創建了一個zlib.Write 對象,並且將buffer 傳遞給了這個對象。接著,將需要進行壓縮的字串寫入這個物件中,最後關閉這個 writer 物件。

列印結果為:zlib: x�� ��J-.N�(,�QP.I,�M-V-.Q�

  1. tar 壓縮

tar 是一種歸檔檔案格式,經常用於將多個檔案或目錄打包成一個檔案。在golang 中進行tar 壓縮的方法,可以使用標準庫中的"archive/tar" 套件。

這裡我們以將一個目錄進行tar 壓縮為例:

package main

import (
    "archive/tar"
    "fmt"
    "io"
    "os"
)

func tarPath(dst, src string) error {
    info, err := os.Stat(src)
    if err != nil {
        return err 
    }

    // 如果源目录是一个文件,直接对这个文件进行压缩
    if !info.IsDir() {
        srcFile, err := os.Open(src)
        if err != nil {
            return err
        }
        defer srcFile.Close()

        dstFile, err := os.Create(dst + ".tar")
        if err != nil {
            return err
        }
        defer dstFile.Close()

        tarWriter := tar.NewWriter(dstFile)
        defer tarWriter.Close()

        hdr := &tar.Header {
            Name: src,
            Mode: int64(info.Mode()),
            Size: info.Size(),
        }

        if err := tarWriter.WriteHeader(hdr); err != nil {
            return err 
        }

        if _, err := io.Copy(tarWriter, srcFile); err != nil {
            return err
        }

        fmt.Println("tar file created:", dst+".tar")
        return nil 
    }

    // 如果源目录是一个文件夹,先遍历源目录
    files, err := os.ReadDir(src)
    if err != nil {
        return err 
    }

    for _, file := range files {
        fileName := file.Name()

        // 这里需要再次判断是否是一个目录
        if file.IsDir() {
            fmt.Println("skipping directory:", fileName)
            continue
        }

        srcFile, err := os.Open(filepath.Join(src, fileName))
        if err != nil {
            return err
        }
        defer srcFile.Close()

        dstFile, err := os.Create(filepath.Join(dst, fileName) + ".tar")
        if err != nil {
            return err
        }
        defer dstFile.Close()

        tarWriter := tar.NewWriter(dstFile)
        defer tarWriter.Close()

        hdr := &tar.Header {
            Name: fileName,
            Mode: int64(file.Mode()),
            Size: file.Size(),
        }

        if err := tarWriter.WriteHeader(hdr); err != nil {
            return err 
        }

        if _, err := io.Copy(tarWriter, srcFile); err != nil {
            return err
        }

        fmt.Println("tar file created:", filepath.Join(dst, fileName)+".tar")
    }

    return nil 
}

func main() {
    srcPath := "./testdir"
    dstPath := "./"

    err := tarPath(dstPath, srcPath)
    if err != nil {
        fmt.Println(err)
    }
}

這段程式碼中,首先對來源路徑進行了一個判斷,如果是一個文件,則直接進行壓縮保存;如果是一個資料夾,則遍歷其中的所有檔案並對每個檔案進行壓縮保存,並將所有檔案進行打包壓縮。

  1. zip 壓縮
##zip 是一種歸檔文件格式,它通常用於將一組文件或目錄打包成一個文件,同時也會對這些文件進行壓縮。在golang 中進行zip 壓縮的方法,可以使用標準庫中的"archive/zip"套件。

這裡我們以將兩個檔案進行zip 壓縮為例:

package main

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
)

func zipFiles(dst string, files []string) error {
    newZipFile, err := os.Create(dst + ".zip")
    if err != nil {
        return err
    }
    defer newZipFile.Close()
    zipWriter := zip.NewWriter(newZipFile)
    defer zipWriter.Close()

    for _, file := range files {
        srcFile, err := os.Open(file)
        if err != nil {
            return err
        }
        defer srcFile.Close()

        info, _ := srcFile.Stat()

        header, err := zip.FileInfoHeader(info)
        if err != nil {
            return err
        }
        header.Name = file
        header.Method = zip.Deflate

        writer, err := zipWriter.CreateHeader(header)
        if err != nil {
            return err
        }
        if _, err := io.Copy(writer, srcFile); err != nil {
            return err
        }
    }

    fmt.Println("zip file created:", dst+".zip")
    return nil 
}

func main() {
    files := []string{"test.txt", "test1.txt"}
    dstPath := "./"

    err := zipFiles(dstPath, files)
    if err != nil {
        fmt.Println(err)
    }
}

這段程式碼中,主要是透過遍歷需要進行壓縮的檔案列表,並將它們逐一添加到壓縮包中。

總結

golang 對於各種壓縮格式都有對應的處理類別庫,極大的方便了對檔案壓縮的處理流程,這裡僅展示了幾種流行的檔案壓縮方式的處理方法。

以上是golang壓縮方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:golang部署xp下一篇:golang部署xp