📜  Golang 中的 io.PipeWriter.CloseWithError()函数示例

📅  最后修改于: 2021-10-24 13:03:19             🧑  作者: Mango

在 Go 语言中, io包为 I/O 原语提供基本接口。它的主要工作是封装这种原语之王的持续实现。 Go 语言中的PipeWriter.CloseWithError()函数用于关闭编写器。但是,从PipeReader连续读取,即读取管道的一半将不会返回任何字节,如果错误为零,则返回错误err或 EOF 错误。而且,这个函数是在io包下定义的。在这里,您需要导入“io”包才能使用这些功能。

句法:

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

这里,“w”是指向 PipeWriter 的指针。其中 PipeWriter 是管道的写入部分,“err”是我们在代码中声明的错误,如果发生错误就会打印出来。

返回值:如果有我们所说的错误,它返回一个错误,如果错误为零,它返回一个 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("There is an "+
                              "error in the code written!"))
    }()
  
    // 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

这里没有错误返回,因为这里没有调用 CloseWithError() 方法,因为循环仅在一次读取操作后停止。

示例 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("There is"+
                      " an error in the code written!"))
    }()
  
    // 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
panic: There is an error in the code written!

goroutine 1 [running]:
main.main()
    /tmp/sandbox246824679/prog.go:39 +0x3c2

在这里,调用 CloseWithError() 方法时抛出错误,因为“for”循环在第二次迭代后停止。并且这里返回的错误正如我们所说的。