Golang io.PipeReader.Close()函数的用法及示例
在Go语言中,io包提供了基本的I/O原语接口,其主要工作是包装此类基元的正在执行的实现。而Go中的 PipeReader.Close() 函数用于关闭读取器。但是,对PipeWriter即管道的写入一次关闭操作后,第二次写入操作将返回ErrClosedPipe错误。此函数被定义在io包中。您需要导入“io”包以使用这些函数。
语法:
func (r *PipeReader) Close() error
在这里,“r”是指向PipeReader的指针。其中,PipeReader是管道的读取半部分。
返回值: 它返回在调用Close方法之前编写的内容。并且对PipeWriter的连续写操作即管道写半部分将返回ErrClosedPipe错误。
示例1:
// Go程序演示
// io.pipeReader.Close()函数的用法
// 包含主扩展包
package main
// 导入fmt和io
import (
"fmt"
"io"
)
// 调用主函数
func main() {
// 调用管道方法
pipeReader, pipeWriter := io.Pipe()
// 在go函数中调用write方法
go func() {
pipeWriter.Write([]byte("GfG"))
pipeWriter.Write([]byte("GeeksforGeeks"))
pipeWriter.Write([]byte("GfG is a CS-Portal."))
}()
// 使用make关键字创建具有指定长度的缓冲区
buffer := make([]byte, 50)
// 使用for循环
for i := 0; i < 2; i++ {
// 读取缓冲区中的内容
n, err := pipeReader.Read(buffer)
// 如果错误为nil,则产生错误
if err != nil {
panic(err)
}
// 调用Close方法
pipeReader.Close()
// 输出读取的内容
fmt.Printf("%s\n", buffer[:n])
}
}
输出:
GfG
panic: io: read/write on closed pipe
goroutine 1 [running]:
main.main()
/tmp/sandbox180013044/prog.go:38 +0x302
在这里,仅返回在调用Close()方法之前编写的一个操作的内容,但在Close()方法之后编写的内容不是返回值,而是抛出ErrClosedPipe错误。
示例2:
// Golang程序演示
// io.pipeReader.Close()函数的用法
// 包含主函数
package main
// 导入fmt和io
import (
"fmt"
"io"
)
// 调用主函数
func main() {
// 调用管道方法
pipeReader, pipeWriter := io.Pipe()
// 在go函数中调用write方法
go func() {
pipeWriter.Write([]byte("GfG"))
pipeWriter.Write([]byte("GeeksforGeeks"))
pipeWriter.Write([]byte("GfG is a CS-Portal."))
}()
// 使用make关键字创建具有指定长度的缓冲区
buffer := make([]byte, 50)
// 调用Close方法
pipeReader.Close()
// 使用for循环
for i := 0; i < 2; i++ {
// 读取缓冲区中的内容
n, err := pipeReader.Read(buffer)
// 如果错误为nil,则产生错误
if err != nil {
panic(err)
}
// 输出读取的内容
fmt.Printf("%s\n", buffer[:n])
}
}
输出:
panic: io: read/write on closed pipe
goroutine 1 [running]:
main.main()
/tmp/sandbox881512815/prog.go:41 +0x2ea
在这里,由于在任何读取操作之前调用了Close()方法,因此没有任何内容被读入缓冲区,只会抛出错误。