Golang io.PipeWriter.CloseWithError()的应用及示例

Golang io.PipeWriter.CloseWithError()的应用及示例

Go 语言中,io 包为 I/O 原语提供了基本接口,其主要任务是包装此类原语的实现。Go 语言中的 PipeWriter.CloseWithError() 函数用于关闭写入器。但是,从管道的读半部分 PipeReader 连续读取将不会返回任何字节,并且如果错误为 nil,则返回 err 或 EOF 错误。此外,此函数在 io 包中定义。在此,您需要导入“io”包以使用这些函数。

语法:

func (w *PipeWriter) CloseWithError(err error) error

这里,“w”是 PipeWriter 的指针。其中 PipeWriter 是管道的写半部分,“err”是我们在代码中声明的错误,如果发生错误,将打印它。

返回值: 如果我们所述的任何错误都返回错误,否则如果错误为 nil,则返回 EOF。

注: 此方法不会重写以前的错误,如果错误重复,则每次都会返回“nil”。

示例1:

// Golang program to illustrate the usage of
// io.PipeWriter.CloseWithError() function
  
// Including main package
package main
  
// Importing fmt and io
import (
    "fmt"
    "io"
)
  
// Calling main
func main() {
  
    // Calling Pipe method
    pipeReader, pipeWriter := io.Pipe()
  
    // Defining data parameter of Read method
    data := make([]byte, 20)
  
    // Reading data into the buffer stated
    go func() {
        pipeReader.Read(data)
  
        // Calling CloseWithError() method with
        // its parameter
        pipeReader.CloseWithError(fmt.Errorf("代码中发生了一个错误!"))
    }()
  
    // Using for loop
    for i := 0; i < 1; i++ {
  
        // Calling pipeWriter.Write() method
        n, err := pipeWriter.Write([]byte("GeeksforGeeks!"))
  
        // If error is not nil panic
        if err != nil {
            panic(err)
        }
  
        // Prints the content written
        fmt.Printf("%v\n", string(data))
  
        // Prints the number of bytes
        fmt.Printf("%v\n", n)
    }
} 

输出结果:

GeeksforGeeks!
14

这里由于循环仅进行了一次读取操作,因此此处未返回任何错误。

示例2:

// Golang program to illustrate the usage of
// io.PipeWriter.CloseWithError() function
  
// Including main package
package main
  
// Importing fmt and io
import (
    "fmt"
    "io"
)
  
// Calling main
func main() {
  
    // Calling Pipe method
    pipeReader, pipeWriter := io.Pipe()
  
    // Defining data parameter of Read method
    data := make([]byte, 20)
  
    // Reading data into the buffer stated
    go func() {
        pipeReader.Read(data)
  
        // Calling CloseWithError() method with
        // its parameter
        pipeReader.CloseWithError(fmt.Errorf("代码中发生了一个错误!"))
    }()
  
    // Using for loop
    for i := 0; i < 2; i++ {
  
        // Calling pipeWriter.Write() method
        n, err := pipeWriter.Write([]byte("GeeksforGeeks!"))
  
        // If error is not nil panic
        if err != nil {
            panic(err)
        }
  
        // Prints the content written
        fmt.Printf("%v\n", string(data))
  
        // Prints the number of bytes
        fmt.Printf("%v\n", n)
    }
} 

输出结果:

GeeksforGeeks!
14
恐慌:代码写错了!

协程1 [运行]:
main.main()
    /tmp/sandbox246824679/prog.go:39 +0x3c2

这里,由于“for”循环在第二次迭代后停止,所以会抛出一个错误来表示CloseWithError()方法的调用失败。此处返回的错误是由我们所声明的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程