网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
“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
两个接口最为关键,很多原生结构都是围绕这两个接口展开的。
下面就来分别说说这两个接口:
Reader 接口
io.Reader
表示一个读取器,它将数据从某个资源读取到传输缓冲区。在缓冲区中,数据可以被流式传输和使用。
接口定义如下:
type Reader interface {
Read(p []byte) (n int, err error)
}
Read()
方法将 len(p)
个字节读取到 p
中。它返回读取的字节数 n
,以及发生错误时的错误信息。
举一个例子:
package main
import (
“fmt”
“io”
“os”
“strings”
)
func main() {
reader := strings.NewReader(“Clear is better than clever”)
p := make([]byte, 4)
for {
n, err := reader.Read§
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
表示一个编写器,它从缓冲区读取数据,并将数据写入目标资源。
type Writer interface {
Write(p []byte) (n int, err error)
}
Write
方法将 len(p)
个字节从 p
中写入到对象数据流中。它返回从 p
中被写入的字节数 n
,以及发生错误时返回的错误信息。
举一个例子:
package main
import (
“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
接口类型。
转换原理
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
接口类型。
转换原理
[外链图片转存中…(img-ILZY0Xn6-1715620141045)]
[外链图片转存中…(img-cHogjDe8-1715620141046)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!