Golang 中的 io 包详解(一):基础接口

news/2024/11/17 16:37:36/

Golang 中的 io 包提供了许多用于处理 I/O(输入输出) 操作的接口和函数,在许多标准库中都可以看到这些接口和函数的应用。本文首先介绍一下 io 包的几个基础接口。

io.Reader

io.Reader 表示任何可以读取数据的对象,定义了基本的 Read 方法。

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

Read 方法读取长度为 len(p) 字节的数据到 p 中,返回两个参数,读取数据的字节数(0 <= n <= len(p))和 error 信息。当 Read 在读取 n>0 个字节后遇到错误或 EOF 时,返回读取的字节数和一个可能为非空的 error,下次接着读取时,会返回 0 和 非空 error。看个示例:

package mainimport ("fmt""io""os"
)func main() {f, err := os.Open("test.txt")if err != nil {panic(err)}defer f.Close()buf := make([]byte, 4) // 实例化一个长度为4的[]bytei := 0for {i++n, err := f.Read(buf) fmt.Printf("第 %d 次读取, ", i)fmt.Printf("返回行数:%d,error 信息:%v ", n, err)if n == 0 || err == io.EOF {fmt.Println("文件以读取完毕")break}fmt.Printf("读取内容:%s \n", string(buf[:n]))}
}

将 test.txt 文件内容设置为 3 个字节 lud,运行看下效果:

第 1 次读取, 返回行数:3,error 信息:<nil> 读取内容:lud 
第 2 次读取, 返回行数:0,error 信息:EOF 文件以读取完毕

将 test.txt 文件内容设置为 4 个字节 ludu,运行看下效果:

第 1 次读取, 返回行数:4,error 信息:<nil> 读取内容:ludu 
第 2 次读取, 返回行数:0,error 信息:EOF 文件以读取完毕

将 test.txt 文件内容设置为 5 个字节 luduo,运行看下效果:

第 1 次读取, 返回行数:4,error 信息:<nil> 读取内容:ludu 
第 2 次读取, 返回行数:1,error 信息:<nil> 读取内容:o 
第 3 次读取, 返回行数:0,error 信息:EOF 文件以读取完毕

io.Writer

Writer 接口表示一个可以写入数据的对象,定义了基本的 Write 方法。

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

Write方法写入长度为 len(p) 字节的数据到基本数据流中,返回实际写入的字节数 n 和 error 信息。若 Write 返回的 n < len(p),同时会返回一个非 nil 的 error。简单示例如下:

package mainimport ("fmt""os"
)func main() {file, err := os.Create("file.txt")if err != nil {panic(err)}defer file.Close()data := []byte("luduoxin's blog")n, err := file.Write(data)if err != nil {panic(err)}fmt.Printf("%d bytes written", n)
}

io.Closer

Closer 接口表示可以关闭的对象,定义了一个基本的 Close 方法,通常在完成读写后关闭IO流以释放资源。

type Closer interface {Close() error
}

Close 方法用于释放资源,返回可能出现的 error,简单示例如下:

import ("os"
)func main() {file, err := os.Create("file.txt")if err != nil {panic(err)}// 在文件使用结束后,需要调用 Close 方法释放资源。defer file.Close()// 文件读写操作...
}

io.Seeker

Seeker 接口表示可以随机读写的对象,定义了基本的 Seek 方法。Seek方法定位到给定偏移量位置,返回新的 offset 和 error 信息。

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

Seek 方法将当前读或写位置设置为距离偏移量 offset 个字节之后的位置。参数 whence 可以是 0、1 或 2:

  1. 参数 whence 为 0 时,表示相对于文件起始位置,offset 必须为非负数。
  2. 参数 whence 为 1 时,表示相对于当前位置,offset 可以为负数。
  3. 参数 whence 为 2 时,表示相对于文件结尾,offset 可以为负数。

Seek 方法将返回新的偏移量和可能出现的错误。示例如下:

package mainimport ("fmt""io""os"
)func main() {file, err := os.Create("file.txt")if err != nil {panic(err)}defer file.Close()// 写入数据到文件中...file.Write([]byte("hello world"))// 将文件指针移动到文件开头file.Seek(0, io.SeekStart)// 从文件中读取数据到切片中buf := make([]byte, 5)file.Read(buf)fmt.Println(string(buf)) // 输出 hello// 将文件指针移动到文件末尾file.Seek(0, io.SeekEnd)// 在文件末尾进行写入操作file.Write([]byte("golang"))
}

通过调用 Seek 方法将文件指针移动到文件开头,并从文件中读取了数据,接下来将文件指针移动到文件末尾,并在文件末尾写入了新的数据。


http://www.ppmy.cn/news/230418.html

相关文章

Ubuntu20.04 终端打开不了的问题排查

Ubuntu20.04 终端打开不了的问题排查 今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终…

MDQ75-16-ASEMI电机专用模块MDQ75-16

编辑&#xff1a;ll MDQ75-16-ASEMI电机专用模块MDQ75-16 型号&#xff1a;MDQ75-16 品牌&#xff1a;ASEMI 封装&#xff1a;MDQ 正向电流&#xff1a;75A 反向电压&#xff1a;1600V 引脚数量&#xff1a;4 芯片个数&#xff1a;4 芯片尺寸&#xff1a;MIL 漏电流&…

bm30 bm31

在这里插入代码片 /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public TreeNode headnull;public TreeNode prevnull;public TreeNode Convert(TreeNode pRootOf…

MDS55-16-ASEMI电机专用模块MDS55-16

编辑&#xff1a;ll MDS55-16-ASEMI电机专用模块MDS55-16 型号&#xff1a;MDS55-16 品牌&#xff1a;ASEMI 封装&#xff1a;MDS 正向电流&#xff1a;55A 反向电压&#xff1a;1600V 引脚数量&#xff1a;5 芯片个数&#xff1a;6 芯片尺寸&#xff1a;MIL 漏电流&…

\033[31m

在一个程序中看到这个&#xff1a; write(1, "\033[31m", 5); 向标准输出写入&#xff1a; "\033[31m" 。这是什么呢&#xff1f; 原来是设置输出的颜色。见wiki百科 FGREDecho "\033[31m" FGCYANecho "\033[36m" BGREDecho "…

MBR30200PT-ASEMI插件30A 200V肖特基MBR30200PT

编辑-Z MBR30200PT在TO-247封装里采用的2个芯片&#xff0c;其尺寸都是122MIL&#xff0c;是一款插件肖特基二极管。MBR30200PT的浪涌电流Ifsm为275A&#xff0c;漏电流(Ir)为0.05mA&#xff0c;其工作时耐温度范围为-65~175摄氏度。MBR30200PT采用金属硅芯片材质&#xff0c;…

w25n01g 代码_W25N01GV 驱动

最近在项目中用到 W25N01GV 这颗芯片。它是华邦公司的大容量 SPI 接口 Nand Flash,有 1Gbit (128M Bytes)大小,价格也不高。但是在网上找了很久也没找到相关的驱动代码。比较容易找到的是 W25Q128,或 W25Q256 的代码。 还有这篇在 Xilinx 公司的 XC6SLX45-2CSG324 上驱动 W2…

国产32位单片机MM32SPIN05PF

灵动微MM32SPIN系列是电机与电源相关应用设计的专用产品家族&#xff0c;使用高性能Arm Cortex-M0与Arm Cortex-M3内核&#xff0c;依据功能区分成专用MCU与驱动MCU两种。MM32SPIN系列最高提供了128KB Flash&#xff0c;内置了多路UART、I2C、SPI、CAN 以及多种高精度模拟外设&…