Golang io.PipeReader.Close()函数的用法及示例

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()方法,因此没有任何内容被读入缓冲区,只会抛出错误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程