Golang io.ReadAtLeast() 函数及其示例
在 Go 语言中,io 包提供了基本的 I/O 原语接口,其主要工作是封装这些原语的正在执行的实现。Go 语言中的 ReadAtLeast() 函数用于从指定的读取器“r”中读取数据,以至少读取指定的最小字节数到指定的缓冲区“buf”中。此外,该函数是在 io 包下定义的。在这里,您需要导入“io”包以便使用这些函数。
语法:
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
在这里,“r”是指定的读取器,“buf”是指定的缓冲区,“min”是读取器读入给定的缓冲区中的最小字节数。
返回值: 它返回指定的缓冲区复制的字节数,并在读取的字节数小于最小字节数时返回错误。在这里,当且仅当错误为 nil 时,“n”返回值将大于“min”字节。但是,如果没有读取任何字节,则返回的错误为“EOF”。
注意: 如果在读取的字节数少于指定的“min”字节数后发生 EOF,则该方法返回 ErrUnexpectedEOF 错误。但是,如果指定的最小字节数大于指定的缓冲区长度,则此方法将返回 ErrShortBuffer 错误。但是,如果指定的读取器在至少读取指定的最小字节数后返回错误,则拒绝该错误。
示例1:
// 演示在Golang 中使用 io.ReadAtLeast() 函数
// 引入主包
package main
// 引入 fmt、io 和 strings
import (
"fmt"
"io"
"strings"
)
// 主函数
func main() {
// 使用 NewReader 方法定义读取器
reader := strings.NewReader("Geeks")
// 使用 make 关键字定义指定长度的缓冲区
buffer := make([]byte, 6)
// 使用其参数调用 ReadAtLeast 方法
n, err := io.ReadAtLeast(reader, buffer, 3)
// 如果错误不为空,则抛出异常
if err != nil {
panic(err)
}
// 输出结果
fmt.Printf("缓冲区中的字节数: %d\n", n)
fmt.Printf("缓冲区的内容: %s\n", buffer)
}
输出:
缓冲区中的字节数:5
缓冲区的内容:Geeks
在这里,返回的‘n’是5,大于“min”的3,因为没有错误。
示例2:
// 演示在Golang 中使用 io.ReadAtLeast() 函数
// 引入主包
package main
// 引入 fmt、io 和 strings
import (
"fmt"
"io"
"strings"
)
// 主函数
func main() {
// 使用 NewReader 方法定义读取器
reader := strings.NewReader("GeeksforGeeks")
// 使用 make 关键字定义指定长度的缓冲区
buffer := make([]byte, 4)
// 使用其参数调用 ReadAtLeast 方法
n, err := io.ReadAtLeast(reader, buffer, 5)
// 如果错误不为空,则抛出异常
if err != nil {
panic(err)
}
// 输出结果
fmt.Printf("缓冲区中的字节数: %d\n", n)
fmt.Printf("缓冲区的内容: %s\n", buffer)
}
输出:
panic: short buffer
goroutine 1 [running]:
main.main()
/tmp/sandbox041442440/prog.go:29 +0x20f
在这里,上面代码中指定的缓冲区的长度小于指定的“min”字节数,所以会产生一个错误。