编程 Go语言中的`io`包,涵盖了输入输出的基本概念及其相关接口

2024-11-19 08:52:16 +0800 CST views 1248

概述

I/O(输入输出)是操作系统的基础概念,用于抽象对输入输出设备的操作。Go 语言的 io 包对这些功能进行了抽象,通过统一的接口对各种输入输出设备进行操作。

Reader

Reader 对象是对输入设备的抽象。一个 Reader 可以绑定到一个输入对象,并从该输入设备读取数据。其接口声明如下:

type Reader interface {
    Read(p []byte) (n int, err error)
}

除了基础的 Reader 接口,io 包还提供了 LimitReaderMultiReaderTeeReader

  • LimitReader:只读取指定长度的数据。
  • MultiReader:聚合多个 Reader,并依次进行读取。
  • TeeReader:将一个输入绑定到一个输出。

函数声明如下:

func LimitReader(r Reader, n int64) Reader

func MultiReader(readers ...Reader) Reader

func TeeReader(r Reader, w Writer) Reader

这些衍生 Reader 通过包装的方式使用,即传入一个 Reader,为其增加额外功能,并返回一个新的 Reader

示例

以下是一个简单的示例,演示如何使用 LimitReader 来限制读取的数据长度:

package main

import (
	"io"
	"strings"
	"os"
)

func main() {
	r := strings.NewReader("some io.Reader stream to be read\n")
	lr := io.LimitReader(r, 4)
	io.Copy(os.Stdout, lr)
}

该程序会输出:

some

ReadAtLeast & ReadFull

ReadAtLeastReadFull 用于从 Reader 中读取数据到指定缓冲区。

  • ReadAtLeast:会读取至少 min 个字节的数据。
  • ReadFull:会读取直到数据填满整个缓冲区。

函数声明如下:

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)

func ReadFull(r Reader, buf []byte) (n int, err error)

Writer

Writer 对象是对输出设备的抽象。一个 Writer 可以绑定到一个输出对象,并向该输出设备写入数据。其接口声明如下:

type Writer interface {
    Write(p []byte) (n int, err error)
}

类似于 ReaderWriter 也有 MultiWriter,可以同步输出到多个 Writer。函数声明如下:

func MultiWriter(writers ...Writer) Writer

WriteString

WriteString 函数用于向某个 Writer 写入一个字符串,声明如下:

func WriteString(w Writer, s string) (n int, err error)

ReadWriter

ReadWriter 结合了 ReaderWriter,可以同时进行读取和写入操作。其接口声明如下:

type ReadWriter interface {
    Reader
    Writer
}

Copy

io 包的常用操作之一是数据复制。io 包提供了多个复制函数,用于将数据从一个 Reader 复制到一个 Writer

Copy

Copy 是最基础的复制函数,读取 Reader 中的数据,直到 EOF,并写入 Writer。函数声明如下:

func Copy(dst Writer, src Reader) (written int64, err error)

CopyBuffer

CopyBuffer 函数在 Copy 的基础上允许指定数据缓冲区。每次调用 Copy 函数时,都会生成一个临时的缓冲区,可能会带来一定的分配开销。CopyBuffer 可以多次复用同一块缓冲区。函数声明如下:

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)

CopyN

CopyNCopy 的基础上,允许额外指定复制的字节数。函数声明如下:

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)

更多内容

io 包中还有许多本文未涉及的内容,包括 PipeReaderPipeWriterByteReaderByteWriter 等针对具体类型的实现和一些辅助函数。详细信息请参考 golang/io


通过以上内容,您可以了解如何使用 Go 语言中的 io 包进行各种输入输出操作,并通过不同的接口和函数对数据流进行灵活处理。

复制全文 生成海报 Go语言 输入输出 编程 接口 数据处理

推荐文章

Boost.Asio: 一个美轮美奂的C++库
2024-11-18 23:09:42 +0800 CST
windows安装sphinx3.0.3(中文检索)
2024-11-17 05:23:31 +0800 CST
Golang - 使用 GoFakeIt 生成 Mock 数据
2024-11-18 15:51:22 +0800 CST
Linux 网站访问日志分析脚本
2024-11-18 19:58:45 +0800 CST
Vue3中的虚拟滚动有哪些改进?
2024-11-18 23:58:18 +0800 CST
PHP 如何输出带微秒的时间
2024-11-18 01:58:41 +0800 CST
html5在客户端存储数据
2024-11-17 05:02:17 +0800 CST
MySQL用命令行复制表的方法
2024-11-17 05:03:46 +0800 CST
js函数常见的写法以及调用方法
2024-11-19 08:55:17 +0800 CST
任务管理工具的HTML
2025-01-20 22:36:11 +0800 CST
PHP如何进行MySQL数据备份?
2024-11-18 20:40:25 +0800 CST
实用MySQL函数
2024-11-19 03:00:12 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
如何优化网页的 SEO 架构
2024-11-18 14:32:08 +0800 CST
赚点点任务系统
2024-11-19 02:17:29 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
15 个你应该了解的有用 CSS 属性
2024-11-18 15:24:50 +0800 CST
从Go开发者的视角看Rust
2024-11-18 11:49:49 +0800 CST
程序员出海搞钱工具库
2024-11-18 22:16:19 +0800 CST
HTML + CSS 实现微信钱包界面
2024-11-18 14:59:25 +0800 CST
Vue3中的组件通信方式有哪些?
2024-11-17 04:17:57 +0800 CST
程序员茄子在线接单