Golang 中的 io 包详解:组合接口
创始人
2025-06-28 08:01:27
0

io.ReadWriter

// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
	Reader
	Writer
}

是对Reader和Writer接口的组合,聚合了基本的读写操作。简单示例如下:

package main

import (
	"bytes"
	"fmt"
	"io"
)

func main() {
	var buf bytes.Buffer
	rw := io.ReadWriter(&buf)

	// 写入数据
	_, err := rw.Write([]byte("hello world"))
	if err != nil {
		panic(err)
	}

	// 读取数据
	var data = make([]byte, 11)
	_, err = rw.Read(data)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(data))
}

io.ReadCloser

// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {
	Reader
	Closer
}

是对Reader和Closer接口的组合,聚合了基本的读操作和关闭操作。使用 ReadCloser 接口时,一般会通过 NewReader 或其它方式获取一个 io.ReadCloser 对象,然后通过 Read 方法不断读取数据,直到数据读取结束,最后通过 Close 方法释放资源。

io.WriteCloser

// WriteCloser is the interface that groups the basic Write and Close methods.
type WriteCloser interface {
	Writer
	Closer
}

是对Writer和Closer接口的组合,聚合了基本的写操作和关闭操作。使用 WriteCloser 接口时,一般会通过 NewWriter 或其它方式获取一个 io.WriteCloser 对象,然后通过 Write 方法不断写入数据,直到数据写入结束,最后通过 Close 方法释放资源。简单示例如下:

package main

import (
	"bufio"
	"compress/gzip"
	"os"
)

func main() {
	f, err := os.Create("test.gz")
	if err != nil {
		panic(err)
	}
	defer f.Close()

	// 通过 gzip.NewWriter 方法创建一个 io.WriteCloser 对象
	// 用于将数据压缩并写入文件中
	w := gzip.NewWriter(f)
	defer w.Close()

	// 将数据写入到 io.WriteCloser 对象中
	writer := bufio.NewWriter(w)
	_, err = writer.WriteString("hello world")
	if err != nil {
		panic(err)
	}

	writer.Flush()
}

首先通过 os.Create 方法创建一个文件对象 f,然后通过 gzip.NewWriter 方法创建一个 io.WriteCloser 对象 w,该对象将数据写入到 f 中,并对数据进行压缩。接着通过 bufio.NewWriter 方法创建一个 bufio.Writer 对象 writer,该对象将数据写入到 io.WriteCloser 对象中。最后调用 writer.Flush 方法将缓冲区中的数据写入到 io.WriteCloser 对象中,然后释放资源。

io.ReadWriteCloser

// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
	Reader
	Writer
	Closer
}

是对 Reader、Writer 和 Closer 接口的组合,聚合了基本的读写操作和关闭操作。使用 ReadWriteCloser 接口时,可以通过 Read 方法从数据源读取数据,通过 Write 方法写入数据到数据接收器中,最后通过 Close 方法释放资源。

io.ReadSeeker

// ReadSeeker is the interface that groups the basic Read and Seek methods.
type ReadSeeker interface {
	Reader
	Seeker
}

是对 Reader 和 Seeker 接口的组合,聚合了基本的读取和移位操作。使用 ReadSeeker 接口时,可以通过 Read 方法从数据源读取数据,通过 Seek 方法在数据源中定位读取位置,然后再通过 Read 方法继续读取数据。简单示例:

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	s := strings.NewReader("0123456789")
	rs := io.ReadSeeker(s)

	// 读取前 4 个字节
	var data = make([]byte, 4)
	_, err := rs.Read(data)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(data))

	// 定位到第 6 个字节
	offset, err := rs.Seek(2, io.SeekCurrent)
	if err != nil {
		panic(err)
	}
	fmt.Printf("current offset:%d\n", offset)

	// 读取后 5 个字节
	data = make([]byte, 5)
	_, err = rs.Read(data)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(data))
}

io.ReadSeekCloser

// ReadSeekCloser is the interface that groups the basic Read, Seek and Close
// methods.
type ReadSeekCloser interface {
	Reader
	Seeker
	Closer
}

是对 Reader、Seeker 和 Closer 接口的组合,聚合了基本的读操作、移位操作和关闭操作。使用 ReadSeekCloser 接口时,可以通过 Read 方法从数据源读取数据,通过 Seek 方法在数据源中定位读取位置,最后通过 Close 方法释放资源。

io.WriteSeeker

// WriteSeeker is the interface that groups the basic Write and Seek methods.
type WriteSeeker interface {
	Writer
	Seeker
}

是对 Writer 和 Seeker 接口的组合,聚合了基本的写操作和移位操作。

io.ReadWriteSeeker

// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
type ReadWriteSeeker interface {
	Reader
	Writer
	Seeker
}

是对 Reader、Writer 和 Seeker 接口的组合,聚合了基本的读写操作和移位操作。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...