golang 是一種非常流行的高效能程式語言,具有比較強大的程式碼執行能力,而且它的標準函式庫中也擁有許多對各種檔案壓縮格式進行處理的方法。本文將介紹 golang 壓縮方法的使用。
首先需要引入 "compress" 和 "archive" 套件,它們都是 golang 標準函式庫中的壓縮處理相關套件。但具體選用哪一個,需要根據壓縮格式來進行選擇。
在 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Յ_(�з)_/�
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�
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) } }
這段程式碼中,首先對來源路徑進行了一個判斷,如果是一個文件,則直接進行壓縮保存;如果是一個資料夾,則遍歷其中的所有檔案並對每個檔案進行壓縮保存,並將所有檔案進行打包壓縮。
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壓縮方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!