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 的错误。

原文地址:https://www.cnblogs.com/vincenshen/p/9239133.html

时间: 2024-10-07 05:48:44

Go 内置库 IO interface的相关文章

RF内置库-----内置库的学习过程总结

前段时间充忙的学习RF,系统学习完之后就开始动手做各种接口的测试,虽然各类的接口测试基本能跑通了,但是重复造车的问题存在太明显.RF本身内置库就已经比较丰富,比如不需要import直接就加载到内存的BuiltIn库,还有需要import的常用模块String,Collections,XML库.在前面的接口测试中,使用最多的就是这几个内置库,接口返回的数据基本都是xml格式的居多,然后自己也重复造车了,为此特地花了几天时间去学习了下内置库,主要还是学了下XML库,以下的分享都是基于XML库. 学习

星云链智能合约开发(八):智能合约中调用内置库

BigNumber BigNumber 模块构建于 bignumber.js之上,用来处理任意精度的十进制和非十进制运算.合约可以直接使用 BigNumber 来处理交易和其他转账操作中涉及到的数值计算. var value = new BigNumber(0); value.plus(1); - Storage storage 模块用来支持Nebulas上的数据持久化存储.功能上类似于传统的键值存储系统,当然存储不是免费的,需要消耗一定的 GAS.LocalContractStorage 是可

Python基础篇【第1篇】: 内置库模块 OS

os包提供了操作系统函数的不依赖平台的接口.设计为Unix风格的,虽然错误处理是go风格的:失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.os包的接口规定为在所有操作系统中都是一致的.非公用的属性可以从操作系统特定的syscall包获取. 官方链接:https://studygolang.com/pkgdoc =============== 函数部分 ===================== func Hostname func Hostname() (name string,

Go基础篇【第2篇】: 内置库模块 fmt

package fmt import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O.格式化动作('verb')源自C语言但更简单. Printing verb: 通用: %v 值的默认格式表示 %+v 类似%v,但输出结构体时会添加字段名 %#v 值的Go语法表示 %T 值的类型的Go语法表示 %% 百分号 布尔值: %t 单词true或false 整数: %b 表示为二进制 %c 该值对应的unicode码值 %d 表示为十进制 %o 表示为八进制 %q

python常用的内置库

标准库: import os os.getcwd()  //返回当前工作路径 os.chdir('/server/accesslogs')   # Change current working directory dir() 函数算得上是Python比较常用也很好用的一个函数.它返回包含要查询对象的所有属性名称的列表 import shutil shutil.copyfile('data.db', 'archive.db')  //复制文件 shutil.move('/build/executa

编译调试go的内置库

编译html库 源码结构:pkg结构: 更改了源代码里的template/template.go,然后想在相关的调用代码里看到改变. 其实很简单,直接把template.a重命名或者删掉,然后更改源代码,运行调用了源代码的相关代码,系统会自动生成相关的pkg文件 重命名template.a 为 template.a1 修改template.go的源码 运行调用了template.go的相关代码,可以看到重新生成的template.a 看到console里的确输出了打印信息 原文地址:http:/

python-使用内置库pytesseract实现图片验证码的识别

环境准备: 1.安装Tesseract模块 git文档地址:https://digi.bib.uni-mannheim.de/tesseract/ 百度网盘下载地址: 链接:https://pan.baidu.com/s/16RoJ19WynWOKI4Zpr0bKzA 提取码:5hst 下载后右击安装即可 2.配置环境变量: 编辑 系统变量里面 path,添加下面的安装路径:D:\Program Files\Tesseract-OCR(填写自己的实际安装路径) 3.安装python的第三方库:

itertools内置库

1 itertools.chain(*iterable) 将多个序列作为一个单独的序列返回 import itertools for ele in itertools.chain('We', ' are ', ' champion.'): print ele output: W e a r e c h a m p i o n . 在iter中添加判断类 2 itertools.compress(data, selector) 返回selector为True的data对应元素 import ite

python中enumerate内置库的使用

使用enumerate,可以自动进行索引下标的赋值,本例代码中使用enumerate,进行excel单元格的赋值操作. 代码如果重复被调用,可将该代码封装成类进行使用 1 1 import openpyxl 2 2 #加载excel文件 3 3 wb = openpyxl.load_workbook('test_datas/test_cases.xlsx') 4 4 #定位工作簿 5 5 sheet = wb['test'] 6 6 #测试数据 7 7 datas = [ 8 8 {'origi