golang,go,博客,开源,编程

golang基础之io

Updated on with 0 views and 0 comments

一、核心接口

  1. 基础接口
    • ‌**io.Reader
      定义数据读取方法:Read(p []byte) (n int, err error),用于从数据源读取数据到字节切片 p中,返回实际读取的字节数和可能的错误‌
    • ‌**io.Writer
      定义数据写入方法:Write(p []byte) (n int, err error),将字节切片 p中的数据写入目标,返回实际写入的字节数和错误‌
    • ‌**io.Closer
      提供资源关闭方法:Close() error,用于释放文件、网络连接等资源‌
  2. 扩展接口
    • ‌**io.Seeker
      支持随机访问:Seek(offset int64, whence int) (int64, error),通过 whenceSeekStartSeekCurrentSeekEnd)调整读写位置‌
    • 组合接口
      ReadWriter(组合 ReaderWriter)、ReadCloser(组合 ReaderCloser),提供多操作能力的集成接口‌。

二、工具函数

  1. 数据传输
    • ‌**io.Copy(dst Writer, src Reader) (written int64, err error)
      将数据从 src复制到 dst,自动处理底层缓冲和错误‌
    • ‌**io.CopyN(dst Writer, src Reader, n int64) (written int64, err error)
      限定复制 n字节的数据‌
  2. 辅助函数
    • ‌**io.ReadAll(r Reader) ([]byte, error)
      读取全部数据直到 EOF,返回完整字节切片‌
    • ‌**io.ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
      确保至少读取 min字节,否则返回 ErrShortBuffer

三、标准库中的实现

Go 标准库的多个包实现了 io 接口,常见类型包括:

  1. strings.Readerbytes.Reader
    封装字符串或字节切片为可读流,支持随机访问(Seek() 方法)
  2. bufio
    提供带缓冲的读写器(如 bufio.Reader),减少系统调用次数,提升性能
  3. os.File
    文件操作的核心类型,实现 ReaderWriter 接口,支持读写本地文件
  4. io.Pipe
    创建内存管道,用于协程间数据流传递四 示例

四、示例

实现了 Reader 接口的类型包括:

  • os.File:用于文件操作。
  • bytes.Reader:用于读取字节切片。
  • strings.Reader:用于读取字符串。
  • bufio.Reader:提供带缓冲区的读取功能。

示例:使用 os.File 实现 Reader 接口读取文件内容

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    buffer := make([]byte, 1024)
    for {
        n, err := file.Read(buffer)
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Println("Error reading file:", err)
            return
        }
        fmt.Print(string(buffer[:n]))
    }
}

Writer 接口

Writer 接口用于向数据目标写入数据。其定义如下:

type Writer interface {
    Write(p []byte) (n int, err error)
}
  • Write(p []byte) (n int, err error):将 p 中的 len(p) 个字节写入数据目标。返回实际写入的字节数 n 和可能发生的错误 err。如果写入的数据少于提供的数据,err 必须非 nil

实现了 Writer 接口的类型包括:

  • os.File:用于文件操作。
  • bytes.Buffer:用于在内存中读写数据。
  • bufio.Writer:提供带缓冲区的写入功能。
  • net.Conn:用于网络连接的读写。

示例:使用 os.File 实现 Writer 接口写入文件

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("example.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()

    content := []byte("Hello, Go I/O!")
    n, err := file.Write(content)
    if err != nil {
        fmt.Println("Error writing to file:", err)
        return
    }
    fmt.Printf("Wrote %d bytes to file\n", n)
}

Closer 接口

Closer 接口用于表示可以关闭的资源,其定义如下:

type Closer interface {
    Close() error
}

实现了 Closer 接口的类型包括:

  • os.File:文件类型。
  • net.Conn:网络连接类型。
  • compress/gzip.Writer:GZIP 压缩写入器。

示例:使用 os.File 实现 Closer 接口关闭文件

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("example.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    // 使用 defer 确保在函数退出时关闭文件
    defer file.Close()

    // 文件操作代码
}

Seeker 接口

Seeker 接口用于表示可以在数据流中定位位置的类型,其定义如下:

type Seeker interface {
    Seek(offset int64, whence int) (ret int64, err error)
}
  • Seek(offset int64, whence int) (ret int64, err error):设置下一次读写操作的偏移量。whence 参数指定基准位置,常用的值有:
    • io.SeekStart:从文件开头开始计算。
    • io.SeekCurrent:从当前位置开始计算。
    • io.SeekEnd:从文件末尾开始计算。

示例:使用 os.File 实现 Seeker 接口定位文件位置

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    // 将文件指针移动到文件末尾
    _, err = file.Seek(0, io.SeekEnd)
    if err != nil {
        fmt.Println("Error seeking file:", err)
        return
    }
    // 获取当前文件指针的位置
    pos, err := file.Seek(0, io.SeekCurrent)
    if err != nil {
  
  1. 关键错误类型
    • ‌**io.EOF
      表示输入结束,通常在 Read方法中作为正常结束信号‌
    • ‌**io.ErrShortBuffer
      缓冲区不足时触发,常见于固定长度数据读取场景‌
      6**8。
    • ‌**io.ErrUnexpectedEOF
      数据未完整读取时抛出(如读取固定块时提前遇到 EOF)‌
      6**。

五、与其他库的协作关系

  1. 标准库实现
    • ‌**os.File‌、‌net.Conn‌、‌bytes.Buffer‌ 等类型均实现了 io.Readerio.Writer接口,可直接用于IO操作‌
    • ‌**bufio
      提供带缓冲的读写器(如 bufio.Reader),优化高频小数据量操作的性能‌
    • ‌**ioutil
      封装便捷函数如 ReadFileWriteFile,简化文件读写流程(底层调用 osio接口)

标题:golang基础之io
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/04/09/1744181384662.html
联系:scotttu@163.com