针对一些输入/输出的场景,一般可能会涉及到读/写操作。比如,对一段字符串进行<code>gzip</code>压缩,或者解压缩,<code>golang</code>下主要通过两个接口来实现:
读的接口声明如下:
<pre><code>type Reader interface { Read(p []byte) (n int, err error) } </code></pre>写接口声明如下:
<pre><code>type Writer interface { Write(p []byte) (n int, err error) } </code></pre>结合<code>compress/gzip</code>包,我们来了解一下这两个接口。<code>gzip</code>中包括两个功能:压缩和解压缩。
解压缩的情况,<code>gzip</code>提供了<code>gzip.Reader</code>对象,用来从压缩的内容中读区被压缩前的原始内容。对象的创建函数如下:
<pre><code>func NewReader(r io.Reader) (*Reader, error) </code></pre>压缩的情况也类似:
<pre><code>func NewWriter(w io.Writer) *Writer </code></pre>对一个被<code>gzip</code>压缩的字符串,该如何转换为<code>io.Reader</code>/<code>io.Writer</code>呢? <code>bytes</code>包提供了<code>Buffer</code>对象,就实现了这两个接口。
拿压缩的情况j举例:
<pre><code>func gzip(src string) string { srcBuffer := bytes.NewBuffer() gzipWriter := gzip.NewWriter([]byte(src)) gzipWriter.Close() return srcBuffer.String() } </code></pre>