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()方法的调用失败。此处返回的错误是由我们所声明的。
极客教程