非常教程

Go参考手册

压缩 | compress

压缩/zlib | compress/zlib

  • import "compress/zlib"
  • 概述
  • 索引
  • 示例

概述

打包 zlib 实现了读取和写入zlib格式压缩数据,如 RFC 1950中所述。

实现提供了在读取和压缩期间解压缩的过滤器。例如,要将压缩数据写入缓冲区:

var b bytes.Buffer
w := zlib.NewWriter(&b)
w.Write([]byte("hello, world\n"))
w.Close()

并读回数据:

r, err := zlib.NewReader(&b)
io.Copy(os.Stdout, r)
r.Close()

索引

  • Constants(常量)
  • Variables(变量)
  • func NewReader(r io.Reader) (io.ReadCloser, error)
  • func NewReaderDict(r io.Reader, dict []byte) (io.ReadCloser, error)
  • type Resetter
  • type Writer
  • func NewWriter(w io.Writer) *Writer
  • func NewWriterLevel(w io.Writer, level int) (*Writer, error)
  • func NewWriterLevelDict(w io.Writer, level int, dict []byte) (*Writer, error)
  • func (z *Writer) Close() error
  • func (z *Writer) Flush() error
  • func (z *Writer) Reset(w io.Writer)
  • func (z *Writer) Write(p []byte) (n int, err error)

示例

NewReader

NewWriter

打包文件

reader.go writer.go

常量

这些常量是从 flate 包中复制的,因此导入“compress/zlib”的代码不需要导入“compress/flate”。

const (
        NoCompression      = flate.NoCompression
        BestSpeed          = flate.BestSpeed
        BestCompression    = flate.BestCompression
        DefaultCompression = flate.DefaultCompression
        HuffmanOnly        = flate.HuffmanOnly
)

变量

var (
        // 读取具有无效校验和的ZLIB数据时会返回ErrChecksum。
        ErrChecksum = errors.New("zlib: invalid checksum")
        // 读取具有无效字典的ZLIB数据时,会返回ErrDictionary。
        ErrDictionary = errors.New("zlib: invalid dictionary")
        // 读取包含无效标题的ZLIB数据时,会返回ErrHeader。
        ErrHeader = errors.New("zlib: invalid header")
)

func NewReader(查看源代码)

func NewReader(r io.Reader) (io.ReadCloser, error)

NewReader 创建一个新的 ReadCloser。从返回的 ReadCloser 读取并解压缩来自r的数据。如果 r 没有实现 io.ByteReader,解压缩程序可能会读取比r更多的数据。调用者有责任在完成时调用ReadCloser 上的 Close。

NewReader 返回的 ReadCloser 也实现了 Resetter。

示例

package main

import (
	"bytes"
	"compress/zlib"
	"io"
	"os"
)

func main() {
	buff := []byte{120, 156, 202, 72, 205, 201, 201, 215, 81, 40, 207,
		47, 202, 73, 225, 2, 4, 0, 0, 255, 255, 33, 231, 4, 147}
	b := bytes.NewReader(buff)

	r, err := zlib.NewReader(b)
	if err != nil {
		panic(err)
	}
	io.Copy(os.Stdout, r)

	r.Close()
}

func NewReaderDict(查看源代码)

func NewReaderDict(r io.Reader, dict []byte) (io.ReadCloser, error)

NewReaderDict 与 NewReader 类似,但使用预设字典。如果压缩数据没有引用它,NewReaderDict 会忽略该字典。如果压缩数据引用不同的字典,则 NewReaderDict 返回 ErrDictionary。

NewReaderDict 返回的 ReadCloser 也实现了 Resetter。

type Resetter(查看源代码)

重置器重置由 NewReader 或 NewReaderDict 返回的 ReadCloser 以切换到新的底层 Reader。这允许重新使用 ReadCloser 而不是分配新的。

type Resetter interface {
        // 重置会丢弃任何缓冲数据,并将重置器重置为好像它一样
        // 最新与给定的读者初始化。
        Reset(r io.Reader, dict []byte) error
}

type Writer(查看源代码)

Writer 将写入数据的数据写入底层写入器(请参阅 NewWriter)。

type Writer struct {
        // 包含过滤或未导出的字段
}

func NewWriter(查看源代码)

func NewWriter(w io.Writer) *Writer

NewWriter 创建一个新的 Writer。写入返回的 Writer 被压缩并写入 w。

调用者有责任在完成时调用 WriteCloser 上的 Close。写入可能会被缓冲,直到关闭才会被刷新。

示例

package main

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

func main() {
	var b bytes.Buffer

	w := zlib.NewWriter(&b)
	w.Write([]byte("hello, world\n"))
	w.Close()
	fmt.Println(b.Bytes())
}

func NewWriterLevel(查看源代码)

func NewWriterLevel(w io.Writer, level int) (*Writer, error)

NewWriterLevel 就像 NewWriter,但指定压缩级别而不是假设 DefaultCompression。

压缩级别可以是DefaultCompression,NoCompression, HuffmanOnly 或 BestSpeed 和 BestCompression 之间的任何整数值。如果级别有效,返回的错误将为零。

func NewWriterLevelDict(查看源代码)

func NewWriterLevelDict(w io.Writer, level int, dict []byte) (*Writer, error)

NewWriterLevelDict 与 NewWriterLevel 类似,但指定要压缩的字典。

字典可能是零。如果没有,则在 Writer 关闭之前不应修改其内容。

func (*Writer) Close(查看源代码)

func (z *Writer) Close() error

关闭Writer,将任何未写入的数据刷新到基础 io.Writer,但不关闭基础 io.Writer。

func (*Writer) Flush(查看源代码)

func (z *Writer) Flush() error

Flush Writer 到其基础 io.Writer。

func (*Writer) Reset(查看源代码)

func (z *Writer) Reset(w io.Writer)

重置清除Writer z 的状态,使其等于 NewWriterLevel 或 NewWriterLevelDict 的初始状态,并且写入 w。

func (*Writer) Write(查看源代码)

func (z *Writer) Write(p []byte) (n int, err error)

写入一个压缩形式的 p 到底层的 io.Writer 。在写入器关闭或明确刷新之前,压缩的字节不一定会被刷新。

Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串