zoukankan      html  css  js  c++  java
  • Go 内置库 IO interface

    基本的 IO 接口

    io 包为 I/O 原语提供了基本的接口。它主要包装了这些原语的已有实现。

    由于这些接口和原语以不同的实现包装了低级操作,因此除非另行通知,否则客户端不应假定它们对于并行执行是安全的。

    在 io 包中最重要的是两个接口:Reader 和 Writer 接口。本章所提到的各种 IO 包,都跟这两个接口有关,也就是说,只要实现了这两个接口,它就有了 IO 的功能。

    Reader 接口

    Reader 接口的定义如下:

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

    官方文档中关于该接口方法的说明:

    Read 将 len(p) 个字节读取到 p 中。它返回读取的字节数 n(0 <= n <= len(p)) 以及任何遇到的错误。即使 Read 返回的 n < len(p),它也会在调用过程中使用 p 的全部作为暂存空间。若一些数据可用但不到 len(p) 个字节,Read 会照例返回可用的数据,而不是等待更多数据。

    下面,我们通过具体例子来谈谈该接口的用法。

    func ReadFrom(reader io.Reader, num int) ([]byte, error) {
        p := make([]byte, num)
        n, err := reader.Read(p)
        if n > 0 {
            return p[:n], nil
        }
        return p, err
    }

    ReadFrom 函数将 io.Reader 作为参数,也就是说,ReadFrom 可以从任意的地方读取数据,只要来源实现了 io.Reader 接口。比如,我们可以从标准输入、文件、字符串等读取数据,示例代码如下:

    // 从标准输入读取
    data, err = ReadFrom(os.Stdin, 11)
    
    // 从普通文件读取,其中 file 是 os.File 的实例
    data, err = ReadFrom(file, 9)
    
    // 从字符串读取
    data, err = ReadFrom(strings.NewReader("from string"), 12)

     

    Writer 接口

    Writer 接口的定义如下:

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

     

    ReaderAt 和 WriterAt 接口

    ReadAt 从基本输入源的偏移量 off 处开始,将 len(p) 个字节读取到 p 中。它返回读取的字节数 n(0 <= n <= len(p))以及任何遇到的错误。

    WriteAt 从 p 中将 len(p) 个字节写入到偏移量 off 处的基本数据流中。它返回从 p 中被写入的字节数 n(0 <= n <= len(p))以及任何遇到的引起写入提前停止的错误。若 WriteAt 返回的 n < len(p),它就必须返回一个 非nil 的错误。

  • 相关阅读:
    PHP 错误:Warning: Cannot modify header information
    PHP截取中文字符串
    myeclipse 保存含中文的jsp失败,提示内容含有 ISO-8859-1 不支持的字符
    jquery ajax到servlet出现中文乱码(utf-8编码下)
    数据结构~动态存储管理(五)
    数据结构~树和二叉树(三)
    数据结构~线性表(二)
    数据结构~基础概念(一)
    每日一摘:串并-并串转换
    每日一摘:Verilog复位
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9239133.html
Copyright © 2011-2022 走看看