Golang io.PipeReader.Read()函数及示例
在Go语言中,io包提供了I / O基元的基本接口。它的主要工作是封装这种原语的正在进行的实现。 PipeReader.Read() 函数在Go语言中用于实现标准读取接口。它从管道中读取信息并阻塞它,直到出现写入器或管道的写入端关闭。此外,此函数在io包中定义。在此,您需要导入“io”包以使用这些函数。
语法:
func (r *PipeReader)Read(data []byte)(n int, err error)
在这里,“r”是指向PipeReader的指针。在这里,PipeReader是管道的读取一半,“data”是指定长度的字节切片,写入的数据被读取到其中。
返回值: 它返回读取的字节数和任何错误。但是,如果使用错误关闭管道的写入端,则将该错误返回为err,否则返回的err是EOF错误。
示例1:
// Golang程序展示用法
// io.PipeReader.Read()函数
// 包括主包
package main
// 导入fmt和io
import (
"fmt"
"io"
)
// 调用main
func main() {
// 调用Pipe方法
pipeReader,pipeWriter:=io.Pipe()
// 将数据写入管道
go func() {
pipeWriter.Write([]byte(“GfG”))
pipeWriter.Write([]byte(“GeeksforGeeks”))
pipeWriter.Write([]byte(“ GfG是一个CS门户”))
// 关闭管道的写入一半
pipeWriter.Close()
// 再次调用Write方法
pipeWriter.Write([]byte("作者!"))
}()
// 定义Read方法的数据参数
data:= make([] byte,20)
// 使用for循环
for i:= 0; i<3; i ++ {
// 调用pipeReader.Read()方法
n,err:= pipeReader.Read(data)
// 如果错误不为nil恐慌
如果err!= nil {
panic(err)
}
// 打印缓冲区中读取的内容
fmt.Printf(“%s \ n”,数据【:n】)
// 打印读取的字节数
fmt.Printf(“%v \ n”,n)
}
} ```
输出:
GfG
3
GeeksforGeeks
13
GfG是一个CS门户。
19
在这里,由于“for”循环运行期间未关闭管道的写入端,因此不返回任何错误。
示例2:
// Golang程序展示用法
// io.PipeReader.Read()函数
// 包括主包
package main
// 导入fmt和io
import (
"fmt"
"io"
)
// 调用main
func main() {
// 调用Pipe方法
pipeReader,pipeWriter:=io.Pipe()
// 将数据写入管道
go func() {
pipeWriter.Write([]byte(“GfG”))
pipeWriter.Write([]byte(“GeeksforGeeks”))
pipeWriter.Write([]byte(“ GfG是一个CS门户”))
// 关闭管道的写入一半
pipeWriter.Close()
// 再次调用Write方法
pipeWriter.Write([]byte("作者!"))
}()
// 定义Read方法的数据参数
data:= make([] byte,20)
// 使用for循环
for i:= 0; i<4; i ++ {
// 调用pipeReader.Read()方法
n,err:= pipeReader.Read(data)
// 如果错误不为nil恐慌
如果err!= nil {
panic(err)
}
// 打印缓冲区中读取的内容
fmt.Printf(“%s \ n”,数据【:n】)
// 打印读取的字节数
fmt.Printf(“%v \ n”,n)
}
} ```
输出:
GfG
3
GeeksforGeeks
13
GfG是一个CS门户网站。
19
panic: EOF(文件结尾错误)
goroutine 1 [正在运行]:
main.main()
/tmp/sandbox634835876/prog.go:43 +0x364
在这里,由于管道的写端在for循环的第三次迭代后被关闭,导致发生EOF错误。