在 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”循环在第二次迭代后停止。并且这里返回的错误正如我们所说的。