Go中Writer和Reader接口的使用入门

 更新时间:2022年04月20日 10:30:59   作者:宇宙之一粟  
本文主要介绍了Go中Writer和Reader接口的使用入门,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

引言

我们学习其他语言编程时,会学到一个 io 包,这个包可以以流的方式高效处理数据,而不用考虑数据是什么,数据来自哪里,以及数据要发送到哪里的问题。

io 是一个 Golang 标准库包,它为围绕输入和输出的许多操作和用例定义了灵活的接口。

io 包参见:golang.org/pkg/io/

与 stdout 和 stdin 对应,Go 语言实现了 io.Writerio.Reader 两个接口。通过实现这两个接口,其他接口都可以使用 io 包提供的所有功能,也可以用于其他包里接收着两个接口的函数以及方法。

Go 还提供了名为 bufioioutil 的包,其中包含与使用这些接口相关的有用功能。

Writer 接口

io.Writer 接口是 Go 非常小的接口之一。它只有一种方法。写入方法。 Go 标准库中的许多包都使用 io.Writer 接口,它表示将字节切片写入数据流的能力。更一般地,允许您将数据写入实现 io.Writer 接口的东西。io.Writer 接口的声明如下:

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

这个接口声明了唯一一个方法 Writer,这个方法接收一个 byte 切片,并返回一个写入的字节数 n 和 error 错误值。

这里会有两个点需要注意:

  • Writer 从 p 字节切片的数据流写入 len(p) 字节的数据。这个方法返回从 p 里写出的字节数(0 <= n <= len(p) ),以及任何可能导致写入提起结束的错误。
  • Writer 在返回 n < len(p) 的时候,必须返回某个 nil 值的 error。Writer 绝不能改写切片里的数据,也不能临时修改。

现在来看一个例子,看在 Go 中将数据写入文件时如何使用 io.Writer

package main

import (
	"fmt"
	"os"
)

func main() {

	f, err := os.OpenFile("hello.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	n, err := f.Write([]byte("Hello, My name is LeeLei!"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("wrote %d bytes", n)
}

运行结果:wrote 25 bytes, 同时我们可以查看 hello.txt 文件内容:

os.File 的 Read 确实是同一个 io.Writer 接口的实现,用于将字节切片写入底层文件的数据流。这是 os.File.Write 的定义:

func (f *File) Write(b []byte) (n int, err error)

Reader 接口

然后来看一下 Reader 接口的声明:

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

Reader 是一个带有强抽象的小接口!那个抽象到底是什么? Read 方法的想法是它表示从某个源读取数据字节,以便我们可以在代码中使用这些字节。该来源可能是文件、相机、网络连接,或者只是一个普通的旧字符串。例如,如果我们从文件中读取数据,我们将使用的 io.Reader*os.File

io.Reader 接口声明了一个方法 Read,这个方法同样接受一个 byte 切片,返回两个值。第一个值是读入的字节数,第二个值是 error 错误值。

  • p []byte 是我们传递给 Read 方法的字节切片。 Reader 将从其数据源(如文件)读取的数据复制到该字节片。
  • 返回的 n int 告诉我们在这个 Read 调用中读取了多少字节。
  • 返回的 err error 是读取数据时可能发生的任何错误,例如到达文件末尾。

让我们用一个文件来尝试一下,看看我们是如何使用它的。复制此文本并将其保存到名为 hello.txt 的新目录中的文件中:

Hello, My name is LeeLei!

现在,让我们编写一些 Go 代码来使用 File 的 Read 方法读取它。复制此代码并将其保存到与 hello.txt 位于同一目录中的文件 main.go 中:

package main

import (
	"log"
	"os"
)

func main() {
	file, err := os.OpenFile("hello.txt", os.O_RDWR|os.O_CREATE|os.O_RDONLY, 0600)
	if err != nil {
		log.Fatalf("error opening hello.txt: %v", err)
	}
	defer file.Close()

	// Make a byte slice that's big enough to store a few words of the message
	// we're reading
	bytesRead := make([]byte, 33)

	// Now read some data, passing in our byte slice
	n, err := file.Read(bytesRead)
	if err != nil {
		log.Fatalf("error reading from hello.txt: %v", err)
	}

	// Take a look at the bytes we copied into the byte slice
	log.Printf("We read \"%s\" into bytesRead (%d bytes)",
		string(bytesRead), n)
}

运行该代码:go run main.go,然后可以看到如下输出:

$ go run main.go     
2022/04/18 22:56:29 We read "Hello, My name is LeeLei!" into bytesRead (25 bytes)

那么当我们调用 os.File.Read 时,Go 会从文件中读取数据,并将其复制到 bytesRead 中,由于没有发生错误,因此返回的错误为 nil。我们将 bytesRead 切片传递给 Read 函数,就像我们将杯子传递给汽水喷泉一样!

总结

本篇文章简单介绍了 Go 语言 io 包中的两个很实用的接口:Writer 和 Reader,分别给出了这两个接口的声明和解释,然后以一个简单的例子在代码中使用这两个小巧的接口,但是 Go 语言设计这两个接口的用法远远不止这些,也需要我们不断去探索其他功能,甚至学有余力去理解 Go 这样的设计的原理。

到此这篇关于Go中Writer和Reader接口的使用入门的文章就介绍到这了,更多相关Go Writer和Reader接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用dep 配置golang 开发环境的操作方法

    使用dep 配置golang 开发环境的操作方法

    下面小编就为大家带来一篇使用dep 配置golang 开发环境的操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • go语言题解LeetCode228汇总区间示例详解

    go语言题解LeetCode228汇总区间示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode228汇总区间示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang template 包基本原理分析

    Golang template 包基本原理分析

    这篇文章主要为大家介绍了Golang template 包基本原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go语言运算符案例讲解

    Go语言运算符案例讲解

    这篇文章主要介绍了Go语言运算符案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • golang实现http server提供文件下载功能

    golang实现http server提供文件下载功能

    这篇文章主要介绍了golang实现http server提供文件下载功能,本文给大家简单介绍了Golang的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 详解Go中gin框架如何实现带颜色日志

    详解Go中gin框架如何实现带颜色日志

    当我们在终端上(比如Goland)运行gin框架搭建的服务时,会发现输出的日志是可以带颜色的,那这是如何实现的呢?本文就来和大家简单讲讲
    2023-04-04
  • Nunu快速构建高效可靠Go应用脚手架使用详解

    Nunu快速构建高效可靠Go应用脚手架使用详解

    这篇文章主要为大家介绍了如何使用Nunu快速构建高效可靠Go应用脚手架详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • golang模拟实现带超时的信号量示例代码

    golang模拟实现带超时的信号量示例代码

    这篇文章主要给大家介绍了关于golang模拟实现带超时的信号量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-09-09
  • Go语言中的字符串拼接方法详情

    Go语言中的字符串拼接方法详情

    本文介绍Go语言中的string类型、strings包和bytes.Buffer类型,介绍几种字符串拼接方法的相关资料,需要的朋友可以参考一下,希望对你有所帮助
    2021-10-10
  • Go语言入门之基础语法和常用特性解析

    Go语言入门之基础语法和常用特性解析

    这篇文章主要给大家讲解了Go语言的基础语法和常用特性解析,比较适合入门小白,文中通过代码示例介绍的非常详细,对我们学习Go语言有一定的帮助,需要的朋友可以参考下
    2023-07-07

最新评论