iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Go中将[]byte转换为io.Reader
  • 170
分享到

怎么在Go中将[]byte转换为io.Reader

2023-06-22 06:06:54 170人浏览 八月长安
摘要

这篇文章主要介绍怎么在Go中将[]byte转换为io.Reader,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果

这篇文章主要介绍怎么在Go中将[]byte转换为io.Reader,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果想要将其转换成 io.Reader,需要怎么做呢?

怎么在Go中将[]byte转换为io.Reader

这个问题解决起来并不复杂,简单几行代码就可以轻松将其转换成功。不仅如此,还可以再通过几行代码反向转换回来。

下面听我慢慢给你吹,首先直接看两段代码。

[]byte 转 io.Reader

package mainimport ( "bytes" "fmt" "log")func main() { data := []byte("Hello AlwaysBeta") // byte slice to bytes.Reader, which implements the io.Reader interface reader := bytes.NewReader(data) // read the data from reader buf := make([]byte, len(data)) if _, err := reader.Read(buf); err != nil {  log.Fatal(err) } fmt.Println(string(buf))}

输出:

Hello AlwaysBeta

这段代码先将 []byte 数据转换到 reader 中,然后再从 reader 中读取数据,并打印输出。

io.Reader 转 []byte

package mainimport ( "bytes" "fmt" "strings")func main() { ioReaderData := strings.NewReader("Hello AlwaysBeta") // creates a bytes.Buffer and read from io.Reader buf := &bytes.Buffer{} buf.ReadFrom(ioReaderData) // retrieve a byte slice from bytes.Buffer data := buf.Bytes() // only read the left bytes from 6 fmt.Println(string(data[6:]))}

输出:

AlwaysBeta

这段代码先创建了一个 reader,然后读取数据到 buf,最后打印输出。

以上两段代码就是 []byte 和 io.Reader 互相转换的过程。对比这两段代码不难发现,都有 NewReader 的身影。而且在转换过程中,都起到了关键作用。

那么问题来了,这个 NewReader 到底是什么呢?接下来我们通过源码来一探究竟。

源码解析

Go 的 io 包提供了最基本的 IO 接口,其中 io.Reader 和 io.Writer 两个接口最为关键,很多原生结构都是围绕这两个接口展开的。

怎么在Go中将[]byte转换为io.Reader

下面就来分别说说这两个接口:

Reader 接口

io.Reader 表示一个读取器,它将数据从某个资源读取到传输缓冲区。在缓冲区中,数据可以被流式传输和使用。

怎么在Go中将[]byte转换为io.Reader

接口定义如下:

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

Read() 方法将 len(p) 个字节读取到 p 中。它返回读取的字节数 n,以及发生错误时的错误信息。

举一个例子:

package mainimport ( "fmt" "io" "os" "strings")func main() { reader := strings.NewReader("Clear is better than clever") p := make([]byte, 4) for {  n, err := reader.Read(p)  if err != nil {   if err == io.EOF {    fmt.Println("EOF:", n)    break   }   fmt.Println(err)   os.Exit(1)  }  fmt.Println(n, string(p[:n])) }}

输出:

4 Clea
4 r is
4  bet
4 ter
4 than
4  cle
3 ver
EOF: 0

这段代码从 reader 不断读取数据,每次读 4 个字节,然后打印输出,直到结尾。

最后一次返回的 n 值有可能小于缓冲区大小。

Writer 接口

io.Writer 表示一个编写器,它从缓冲区读取数据,并将数据写入目标资源。

怎么在Go中将[]byte转换为io.Reader

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

Write 方法将 len(p) 个字节从 p 中写入到对象数据流中。它返回从 p 中被写入的字节数 n,以及发生错误时返回的错误信息。

举一个例子:

package mainimport ( "bytes" "fmt" "os")func main() { // 创建 Buffer 暂存空间,并将一个字符串写入 Buffer // 使用 io.Writer 的 Write 方法写入 var buf bytes.Buffer buf.Write([]byte("hello world , ")) // 用 Fprintf 将一个字符串拼接到 Buffer 里 fmt.Fprintf(&buf, " welcome to golang !") // 将 Buffer 的内容输出到标准输出设备 buf.WriteTo(os.Stdout)}

输出:

hello world ,  welcome to golang !

bytes.Buffer 是一个结构体类型,用来暂存写入的数据,其实现了 io.Writer 接口的 Write 方法。

WriteTo 方法定义:

func (b *Buffer) WriteTo(w io.Writer) (n int64, err error)

WriteTo 方法第一个参数是 io.Writer 接口类型。

转换原理

再说回文章开头的转换问题。

只要某个实例实现了接口 io.Reader 里的方法 Read() ,就满足了接口 io.Reader。

怎么在Go中将[]byte转换为io.Reader

bytes 和 strings 包都实现了 Read() 方法。

// src/bytes/reader.go// NewReader returns a new Reader reading from b.func NewReader(b []byte) *Reader { return &Reader{b, 0, -1} }
// src/strings/reader.go// NewReader returns a new Reader reading from s.// It is similar to bytes.NewBufferString but more efficient and read-only.func NewReader(s string) *Reader { return &Reader{s, 0, -1} }

在调用 NewReader 的时候,会返回了对应的 T.Reader 类型,而它们都是通过 io.Reader 扩展而来的,所以也就实现了转换。

以上是“怎么在Go中将[]byte转换为io.Reader”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎么在Go中将[]byte转换为io.Reader

本文链接: https://www.lsjlt.com/news/303138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Go中将[]byte转换为io.Reader
    这篇文章主要介绍怎么在Go中将[]byte转换为io.Reader,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果...
    99+
    2023-06-22
  • 在GO中将gif图像转换为base64
    在GO语言中,将GIF图像转换为Base64编码是一种常见的操作。通过将图像数据转换为Base64编码,我们可以方便地在网页中嵌入图片,或者将图片数据以字符串形式传输。在GO语言中,可...
    99+
    2024-02-09
    go语言
  • golang怎么将int转为byte类型
    Golang是一门号称最快的编程语言之一,并且在大数据领域中有着广泛的应用。在Golang中,数字类型的转换是经常使用的操作之一。本文将介绍如何将int类型转换为byte类型。在Golang中,int类型是一种整数类型,占用区间为-2147...
    99+
    2023-05-14
    go语言 Golang
  • 怎么在golang中将Int转换为string
    这期内容当中小编将会给大家带来有关怎么在golang中将Int转换为string,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并...
    99+
    2023-06-14
  • 怎么在python中将dataframe转换为ndarray
    这篇文章将为大家详细讲解有关怎么在python中将dataframe转换为ndarray,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.req...
    99+
    2023-06-14
  • 怎么在JavaScript中将 string转换为boolean
    这篇文章将为大家详细讲解有关怎么在JavaScript中将 string转换为boolean,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JavaScript是什么JavaScript是一种...
    99+
    2023-06-14
  • 怎么在c#中将DataTable转换为List
    本篇文章为大家展示了怎么在c#中将DataTable转换为List,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  直接写一个datatable转list的类 利用泛型来写,更加通用pub...
    99+
    2023-06-14
  • 怎么在python中将series转换为dataframe
    这篇文章将为大家详细讲解有关怎么在python中将series转换为dataframe,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释...
    99+
    2023-06-14
  • 怎么在pandas中将NaN转换为None
    怎么在pandas中将NaN转换为None?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原始数据:示例代码:import pandas as ...
    99+
    2023-06-15
  • 怎么在java中将json转换为Map
    怎么在java中将json转换为Map?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布...
    99+
    2023-06-14
  • 怎么在pytorch中将HWC转换为CHW
    这篇文章给大家介绍怎么在pytorch中将HWC转换为CHW,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。import torchimport numpy as npfrom&n...
    99+
    2023-06-15
  • golang中怎么将string转为字节数组(byte)
    Go语言是一门新兴的高效编程语言,被广泛应用于各种领域,特别是服务器端开发。其中,字符串处理是Go语言中的一个重要部分。本文将介绍如何将字符串转换为字节数组(byte),即 golang string 转 byte。什么是字节数组?在Go语...
    99+
    2023-05-14
    Golang go语言
  • 怎么在将html转换为pdf
    怎么在将html转换为pdf?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,...
    99+
    2023-06-14
  • 如何在 Go 中将整数转换为字节
    Golang不知道大家是否熟悉?今天我将给大家介绍《如何在 Go 中将整数转换为字节》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出...
    99+
    2024-04-05
  • 怎么在python中将字典转换为DataFrame
    怎么在python中将字典转换为DataFrame?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyth...
    99+
    2023-06-14
  • 怎么在php中将数组转换为json
    怎么在php中将数组转换为json?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。php数组转json的函数是json_encode()。json_encode(...
    99+
    2023-06-14
  • 怎么在Golang中将interface{}转换为数组
    怎么在Golang中将interface{}转换为数组?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。golang适合做什么golang可以做服务器端开发,但golang很适合做...
    99+
    2023-06-14
  • 怎么在Pandas中将DataFrame转换为字典
    这期内容当中小编将会给大家带来有关怎么在Pandas中将DataFrame转换为字典,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。该to_dict()方法将列名设置为字典键将“ID”列设置为索引然后转置D...
    99+
    2023-06-15
  • golang怎么将字节数组(byte)转为string
    Go语言是一个强大的编程语言,因其资源效率高、跨平台支持好、并发性能优良等特点而备受开发者的欢迎。在Go语言中,字节数组(byte)转字符串(string)是一个常见操作,通常我们使用内置的函数进行转换。本篇文章就来介绍Go语言中字节数组和...
    99+
    2023-05-14
    go语言 Golang
  • 什么是byte?什么是rune?如何将[]byte和[]rune的值转换为字符串?
    这篇文章将为大家详细讲解有关什么是byte?什么是rune?如何将[]byte和[]rune的值转换为字符串?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 字节 (byte) 字节是计算机存储、传输和...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作