Golang io模块详细功能介绍与示例

io是 Go 语言标准库中处理 I/O 操作的核心模块,它定义了许多接口和实用函数,用于处理各种输入输出操作。下面我将详细介绍 io 模块的主要功能,并提供相应的代码示例。

1. 核心接口

1.1 io.Reader 接口

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

示例:从字符串读取数据

package mainimport ("fmt""io""strings"
)func main() {reader := strings.NewReader("Hello, Reader!")buf := make([]byte, 8)for {n, err := reader.Read(buf)fmt.Printf("n = %v, err = %v, buf = %v\n", n, err, buf[:n])if err == io.EOF {break}}
}

1.2 io.Writer 接口

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

示例:写入缓冲区

package mainimport ("fmt""io""os"
)func main() {file, err := os.Create("output.txt")if err != nil {fmt.Println("Error creating file:", err)return}defer file.Close()n, err := io.WriteString(file, "Hello, Writer!")if err != nil {fmt.Println("Error writing to file:", err)return}fmt.Printf("Wrote %d bytes\n", n)
}

1.3 io.Closer 接口

type Closer interface {Close() error
}

示例:资源清理

package mainimport ("fmt""io""os"
)func processFile(filename string) error {file, err := os.Open(filename)if err != nil {return err}defer file.Close() // 确保文件被关闭// 处理文件内容buf := make([]byte, 1024)for {_, err := file.Read(buf)if err == io.EOF {break}if err != nil {return err}// 处理数据...}return nil
}func main() {err := processFile("example.txt")if err != nil {fmt.Println("Error:", err)}
}

1.4 io.Seeker 接口

type Seeker interface {Seek(offset int64, whence int) (int64, error)
}

示例:文件随机访问

package mainimport ("fmt""io""os"
)func main() {file, err := os.Open("example.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close()// 移动到文件末尾_, err = file.Seek(0, io.SeekEnd)if err != nil {fmt.Println("Error seeking:", err)return}// 获取文件大小size, err := file.Seek(0, io.SeekCurrent)if err != nil {fmt.Println("Error getting size:", err)return}fmt.Printf("File size: %d bytes\n", size)// 回到文件开头_, err = file.Seek(0, io.SeekStart)if err != nil {fmt.Println("Error seeking:", err)return}// 读取前10个字节buf := make([]byte, 10)n, err := file.Read(buf)if err != nil {fmt.Println("Error reading:", err)return}fmt.Printf("Read %d bytes: %q\n", n, buf[:n])
}

2. 组合接口

2.1 io.ReadWriter

type ReadWriter interface {ReaderWriter
}

2.2 io.ReadCloser

type ReadCloser interface {ReaderCloser
}

2.3 io.WriteCloser

type WriteCloser interface {WriterCloser
}

2.4 io.ReadSeeker

type ReadSeeker interface {ReaderSeeker
}

2.5 io.ReadWriteSeeker

type ReadWriteSeeker interface {ReaderWriterSeeker
}

示例:使用 io.ReadWriteSeeker

package mainimport ("fmt""io""strings"
)func main() {var rw io.ReadWriteSeeker = &strings.Builder{}// 写入数据_, err := rw.Write([]byte("Hello, World!"))if err != nil {fmt.Println("Error writing:", err)return}// 回到开头_, err = rw.Seek(0, io.SeekStart)if err != nil {fmt.Println("Error seeking:", err)return}// 读取数据buf := make([]byte, 5)n, err := rw.Read(buf)if err != nil {fmt.Println("Error reading:", err)return}fmt.Printf("Read %d bytes: %q\n", n, buf[:n])
}

3. 实用函数

3.1 io.Copy

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

示例:文件复制

package mainimport ("fmt""io""os"
)func main() {srcFile, err := os.Open("source.txt")if err != nil {fmt.Println("Error opening source file:", err)return}defer srcFile.Close()dstFile, err := os.Create("destination.txt")if err != nil {fmt.Println("Error creating destination file:", err)return}defer dstFile.Close()bytesCopied, err := io.Copy(dstFile, srcFile)if err != nil {fmt.Println("Error copying file:", err)return}fmt.Printf("Copied %d bytes\n", bytesCopied)
}

3.2 io.CopyN

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

示例:限制复制字节数

package mainimport ("fmt""io""strings"
)func main() {src := strings.NewReader("This is a long string that we will copy partially")dst := &strings.Builder{}bytesCopied, err := io.CopyN(dst, src, 10)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Copied %d bytes: %q\n", bytesCopied, dst.String())
}

3.3 io.ReadAll

func ReadAll(r Reader) ([]byte, error)

示例:读取所有数据

package mainimport ("fmt""io""strings"
)func main() {r := strings.NewReader("Go is an open source programming language")data, err := io.ReadAll(r)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Read %d bytes: %q\n", len(data), data)
}

3.4 io.ReadAtLeast

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

示例:确保读取足够数据

package mainimport ("fmt""io""strings"
)func main() {r := strings.NewReader("Hello, World!")buf := make([]byte, 10)n, err := io.ReadAtLeast(r, buf, 5)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Read at least %d bytes: %q\n", n, buf[:n])
}

3.5 io.WriteString

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

示例:写入字符串

package mainimport ("fmt""io""os"
)func main() {file, err := os.Create("output.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close()n, err := io.WriteString(file, "Hello, Go!")if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Wrote %d bytes\n", n)
}

4. 高级功能

4.1 io.Pipe

func Pipe() (*PipeReader, *PipeWriter)

示例:管道通信

package mainimport ("fmt""io""time"
)func main() {r, w := io.Pipe()// 写入协程go func() {defer w.Close()for i := 0; i < 3; i++ {fmt.Fprintf(w, "Message %d\n", i)time.Sleep(time.Second)}}()// 读取协程go func() {buf := make([]byte, 1024)for {n, err := r.Read(buf)if err != nil {if err == io.EOF {fmt.Println("End of pipe")} else {fmt.Println("Error:", err)}return}fmt.Print("Received: ", string(buf[:n]))}}()time.Sleep(4 * time.Second)
}

4.2 io.TeeReader

func TeeReader(r Reader, w Writer) Reader

示例:读取同时写入

package mainimport ("fmt""io""os""strings"
)func main() {r := strings.NewReader("Hello, TeeReader!")var buf strings.Buildertee := io.TeeReader(r, &buf)// 从 tee 读取数据data, err := io.ReadAll(tee)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Read from tee:", string(data))fmt.Println("Written to buffer:", buf.String())
}

4.3 io.MultiReader

func MultiReader(readers ...Reader) Reader

示例:合并多个读取器

package mainimport ("fmt""io""strings"
)func main() {r1 := strings.NewReader("Hello, ")r2 := strings.NewReader("MultiReader!")r3 := strings.NewReader(" How are you?")multi := io.MultiReader(r1, r2, r3)data, err := io.ReadAll(multi)if err != nil {fmt.Println("Error:", err)return}fmt.Println(string(data))
}

4.4 io.MultiWriter

func MultiWriter(writers ...Writer) Writer

示例:同时写入多个目标

package mainimport ("fmt""io""os"
)func main() {file, err := os.Create("output.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close()multi := io.MultiWriter(os.Stdout, file)fmt.Fprintln(multi, "This will be written to both stdout and the file")
}

5. 实用类型

5.1 io.LimitedReader

type LimitedReader struct {R Reader // underlying readerN int64  // max bytes remaining
}

示例:限制读取字节数

package mainimport ("fmt""io""strings"
)func main() {r := strings.NewReader("This is a long string")lr := &io.LimitedReader{R: r, N: 10}buf := make([]byte, 20)n, err := lr.Read(buf)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Read %d bytes: %q\n", n, buf[:n])
}

5.2 io.SectionReader

type SectionReader struct {// contains filtered or unexported fields
}

示例:读取文件部分内容

package mainimport ("fmt""io""os"
)func main() {file, err := os.Open("example.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close()// 创建一个 SectionReader,从第10字节开始,读取20字节section := io.NewSectionReader(file, 10, 20)data, err := io.ReadAll(section)if err != nil {fmt.Println("Error:", err)return}fmt.Println(string(data))
}

6. 错误处理

6.1 io.EOF

var EOF = errors.New("EOF")

示例:正确处理 EOF

package mainimport ("fmt""io""strings"
)func main() {r := strings.NewReader("Hello")buf := make([]byte, 10)for {n, err := r.Read(buf)fmt.Printf("n = %d, err = %v\n", n, err)if err == io.EOF {fmt.Println("Reached end of input")break}if err != nil {fmt.Println("Error:", err)break}fmt.Printf("Read %q\n", buf[:n])}
}

6.2 io.ErrClosedPipe

var ErrClosedPipe = errors.New("io: read/write on closed pipe")

示例:处理管道关闭错误

package mainimport ("fmt""io"
)func main() {r, w := io.Pipe()// 关闭写入端w.Close()_, err := w.Write([]byte("test"))if err == io.ErrClosedPipe {fmt.Println("Cannot write to closed pipe")} else if err != nil {fmt.Println("Other error:", err)}_, err = r.Read(make([]byte, 10))if err == io.EOF {fmt.Println("Read from closed pipe returns EOF")}
}

总结

Go 语言的 io 模块提供了:

  1. 一组简洁而强大的接口(Reader, Writer, Closer, Seeker 等)
  2. 多种组合接口满足不同场景需求
  3. 丰富的实用函数(Copy, ReadAll, WriteString 等)
  4. 高级功能如管道、多路读写等
  5. 完善的错误处理机制

通过合理使用这些接口和函数,可以构建高效、灵活的 I/O 处理逻辑,同时保持代码的简洁性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细胞内与细胞间网络整合分析!神经网络+细胞通讯,这个单细胞分析工具一箭双雕了(scTenifoldXct)

生信碱移 细胞间-细胞内通讯网络分析 scTenifoldXct&#xff0c;一种结合了细胞内和细胞间基因网络的计算工具&#xff0c;利用 scRNA-seq 数据检测细胞间相互作用。 单细胞 RNA 测序&#xff08;scRNA-seq&#xff09;能够以稳健且可重复的方式同时收集数万个细胞的转录组信息…

怎么处理 Vue 项目中的错误的?

一、错误类型 任何一个框架,对于错误的处理都是一种必备的能力 在Vue 中,则是定义了一套对应的错误处理规则给到使用者,且在源代码级别,对部分必要的过程做了一定的错误处理。 主要的错误来源包括: 后端接口错误代码中本身逻辑错误二、如何处理 后端接口错误 通过axi…

05.AI搭建preparationの(transformers01)BertTokenizer实现分词编码

一、下载 bert-base-chinese镜像下载 二、简介作用&#xff1a; 模型每个参数占用的字节大小模型大小模型大小层数头数GPT-14 个字节的 FP32 精度浮点数117M446MB1212GPT-22 个字节的 FP161.5亿到1.75亿0.5GB到1.5GB4816GPT-32 个字节的 FP161.75万亿&#xff08;17500亿&a…

工业4G路由器赋能智慧停车场高效管理

工业4G路由器作为智慧停车场管理系统通信核心&#xff0c;将停车场内的各个子系统连接起来&#xff0c;包括车牌识别系统、道闸控制系统、车位检测系统、收费系统以及监控系统等。通过4G网络&#xff0c;将这些系统采集到的数据传输到云端服务器或管理中心&#xff0c;实现信息…

git 基础操作

1. git 的安装 与 卸载 1.1. git 的安装 判断是否安装 git git --version 安装 git: centos: sudo yum -y install git ubuntu: sudo apt-get install git -y windows: 3.安装git和图形化界面工具_哔哩哔哩_bilibili 1.2. git 的卸载 判断是否安装 git git --version…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;…

Vue.js 完全指南:从入门到精通

1. Vue.js 简介 1.1 什么是 Vue.js? Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。所谓"渐进式",意味着 Vue 的设计是由浅入深的,你可以根据自己的需求选择使用它的一部分或全部功能。 Vue 最初由尤雨溪(Evan You)在 2014 年创…

qt QOffscreenSurface详解

1、概述 QOffscreenSurface 是 Qt 中用于离屏渲染的一个类。它允许在不直接与屏幕交互的情况下进行 OpenGL 渲染操作&#xff0c;常用于生成纹理、预渲染场景等。通过 QOffscreenSurface&#xff0c;可以在后台创建一个渲染表面&#xff0c;进行绘制操作&#xff0c;并将结果捕…

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…

NodeJs之fs模块

一、定义&#xff1a; fs 模块可以实现与硬盘的交互。例如&#xff1a;文件的创建、删除、重命名、移动&#xff1b;文件内容的写入、读取&#xff1b;文件夹的操作。 二、引入 fs 模块&#xff1a; const fs require(fs)三、文件写入&#xff1a; 1、异步写入&#xff1a;w…

Android14 Settings应用添加有线网开关条目实现

Android14 Settings应用添加有线网开关条目 文章目录 Android14 Settings应用添加有线网开关条目一、前言二、适配修改1、network_provider_settings.xml2、NetworkProviderSettings.java3、TurnOnOffEthernetNetworkController.java4、去除有线网提示条目。5、效果UI&#xff…

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求&#xff0c;小程序开通直播需要注册主体具备互联网直播的资质&#xff0c;普通企业需要《信息网络传播视听节目许可证》&#xff0c;表演性质的直播需要《网络文化经营许可证》&#xff0c;政府主体需要《社会信用代码》及…

【Linux】MAC帧

目录 一、MAC帧 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC帧格式 &#xff08;三&#xff09;MTU对IP协议的影响、 &#xff08;四&#xff09;MTU对UDP协议的影响 &#xff08;五&#xff09;MTU对TCP协议的影响 二、以太网协议 &…

如何查看window电脑的GPU信息

GPU&#xff08;图形处理器&#xff0c;Graphics Processing Unit&#xff09;和显卡是两个密切相关但不同的概念 概念 1. ‌基本概念‌ ‌GPU‌&#xff1a;是专门用于处理图像和视频信息的微处理器&#xff0c;拥有强大的并行计算能力&#xff0c;主要负责图形渲染、数值分…

大数据判存算法

所谓的大数据判存算法&#xff0c;就是如何在海量数据中快速判断某个数据是否存在。这里用到的知识是布隆过滤器&#xff08;Bloom Filter&#xff09;&#xff0c;下面按照 what - why - how 的顺序来学习它。 1、什么是布隆过滤器 布隆过滤器&#xff08;英语&#xff1a;B…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

Ajax与Axios,以及Apifox的入门使用

Ajax与Axios&#xff0c;以及Apifox的入门使用 作者&#xff1a;blue 时间&#xff1a;2025.3.20 文章目录 Ajax与Axios&#xff0c;以及Apifox的入门使用1.Ajax2.Axios3.Apifox的基本使用内容Path 参数定义语法用途 Query 参数定义语法用途 1.Ajax 概念&#xff1a;Asynchr…

Spring MVC拦截器

一、什么是拦截器 拦截器是 SpringMVC 提供的一种可以在请求处理过程中对请求进行预处理或后处理的机制。简单来说&#xff0c;拦截器就像是一位“守门员”&#xff0c;它拦住所有进来的请求&#xff0c;根据设定的规则决定是否放行或者进行某些操作。 拦截器可以&#xff1a…

mysql语句 聚合+分组+内外链接

1.聚合函数 1.count 记数 2.sum 求和 3.avg *语法&#xff1a;select avg&#xff08;列名&#xff09; from 表名&#xff1b; 4.max 求最大值 5.min 求最小值 求一个班级数学平均分&#xff1f; select avg&#xff08;ifnull&#xff08;math&#xff0c;0&#x…

WPF 与 C# 融合开发:从基础到高级应用(一)

WPF 与 C# 融合开发&#xff1a;从基础到高级应用 一、C# 语言基础回顾 1.1 C# 语言概述 C# 是微软开发的一种现代、面向对象的编程语言&#xff0c;它融合了 C、C 和 Java 等语言的优点&#xff0c;具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发&…